Add new "Move to folder" button

This commit is contained in:
RainLoop Team 2017-02-08 20:48:53 +03:00
parent 2c3881abc6
commit f0e9d1a6d5
14 changed files with 312 additions and 182 deletions

View file

@ -1817,6 +1817,7 @@ NewThemeLink IncludeCss LoadingDescriptionEsc TemplatesLink LangLink IncludeBack
$sLanguageAdmin = $oConfig->Get('webmail', 'language_admin', 'en');
$sTheme = $oConfig->Get('webmail', 'theme', 'Default');
$aResult['NewMoveToFolder'] = (bool) $oConfig->Get('interface', 'new_move_to_folder_button', true);
$aResult['AllowLanguagesOnSettings'] = (bool) $oConfig->Get('webmail', 'allow_languages_on_settings', true);
$aResult['AllowLanguagesOnLogin'] = (bool) $oConfig->Get('login', 'allow_languages_on_login', true);
$aResult['AttachmentLimit'] = ((int) $oConfig->Get('webmail', 'attachment_size_limit', 10)) * 1024 * 1024;
@ -3746,6 +3747,8 @@ NewThemeLink IncludeCss LoadingDescriptionEsc TemplatesLink LangLink IncludeBack
$this->setConfigFromParams($oConfig, 'UseLocalProxyForExternalImages', 'labs', 'use_local_proxy_for_external_images', 'bool');
$this->setConfigFromParams($oConfig, 'NewMoveToFolder', 'interface', 'new_move_to_folder_button', 'bool');
$this->setConfigFromParams($oConfig, 'AllowLanguagesOnSettings', 'webmail', 'allow_languages_on_settings', 'bool');
$this->setConfigFromParams($oConfig, 'AllowLanguagesOnLogin', 'login', 'allow_languages_on_login', 'bool');
$this->setConfigFromParams($oConfig, 'AttachmentLimit', 'webmail', 'attachment_size_limit', 'int');

View file

@ -160,7 +160,8 @@ class Application extends \RainLoop\Config\AbstractConfig
'interface' => array(
'show_attachment_thumbnail' => array(true, ''),
'use_native_scrollbars' => array(false)
'use_native_scrollbars' => array(false),
'new_move_to_folder_button' => array(true)
),
'branding' => array(

View file

@ -26,6 +26,7 @@ en:
LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Allow language selection on settings screen"
LABEL_ALLOW_THEMES_ON_SETTINGS: "Allow theme selection on settings screen"
LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Allow background selection on settings screen"
LABEL_NEW_FOLDER_MOVE: "New \"move to folder\" button"
LABEL_SHOW_THUMBNAILS: "Show thumbnails (attachments)"
LABEL_ALLOW_GRAVATAR: "Allow Gravatar"
LEGEND_MAIN: "Main"

View file

@ -1,164 +1,171 @@
<div class="b-admin-general">
<div class="row" data-bind="visible: weakPassword">
<div class="alert alert-error 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="form-horizontal">
<div class="legend i18n i18n-animation" 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">
<div class="flag-selector">
<span class="flag-wrapper">
<span data-bind="css: 'flag flag-' + language().toLowerCase()" style=""></span>
</span>
<span class="flag-name" tabindex="0" data-bind="text: languageFullName, click: selectLanguage, onSpace: selectLanguage, onEnter: selectLanguage"></span>
&nbsp;&nbsp;
<div data-bind="component: {
name: 'SaveTrigger',
params: { value: languageTrigger }
}"></div>
</div>
</div>
</div>
<div class="control-group">
<label class="control-label" data-i18n="TAB_GENERAL/LABEL_LANGUAGE_ADMIN"></label>
<div class="controls">
<div class="flag-selector">
<span class="flag-wrapper">
<span data-bind="css: 'flag flag-' + languageAdmin().toLowerCase()" style=""></span>
</span>
<span class="flag-name" tabindex="0" data-bind="text: languageAdminFullName, click: selectLanguageAdmin, onSpace: selectLanguageAdmin, onEnter: selectLanguageAdmin"></span>
&nbsp;&nbsp;
<div data-bind="component: {
name: 'SaveTrigger',
params: { value: languageAdminTrigger }
}"></div>
</div>
</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>
</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 data-bind="component: {
name: 'Checkbox',
params: {
label: 'TAB_GENERAL/LABEL_ALLOW_GRAVATAR',
value: capaGravatar,
inline: true
}
}"></div>
(<a class="g-ui-link" href="http://en.gravatar.com/" target="_blank">http://en.gravatar.com/</a>)
</div>
</div>
<div class="legend i18n i18n-animation" 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">
<div data-bind="component: {
name: 'Input',
params: {
label: 'MB',
value: mainAttachmentLimit,
trigger: attachmentLimitTrigger,
size: 1
}
}"></div>
<br />
<br />
<span class="well well-small" data-bind="visible: '' !== uploadDataDesc">
<b>PHP:</b>
&nbsp;
<span data-bind="text: uploadDataDesc"></span>
</span>
&nbsp;&nbsp;&nbsp;
<a href="#" target="_blank" class="btn btn-thin" data-bind="link: phpInfoLink()">
<i class="icon-info"></i>
</a>
</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 class="control-group">
<div class="controls">
<div data-bind="component: {
name: 'Checkbox',
params: {
label: 'TAB_GENERAL/LABEL_ALLOW_TEMPLATES',
value: capaTemplates
}
}"></div>
</div>
</div>
-->
</div>
<div class="b-admin-general">
<div class="row" data-bind="visible: weakPassword">
<div class="alert alert-error 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="form-horizontal">
<div class="legend i18n i18n-animation" 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">
<div class="flag-selector">
<span class="flag-wrapper">
<span data-bind="css: 'flag flag-' + language().toLowerCase()" style=""></span>
</span>
<span class="flag-name" tabindex="0" data-bind="text: languageFullName, click: selectLanguage, onSpace: selectLanguage, onEnter: selectLanguage"></span>
&nbsp;&nbsp;
<div data-bind="component: {
name: 'SaveTrigger',
params: { value: languageTrigger }
}"></div>
</div>
</div>
</div>
<div class="control-group">
<label class="control-label" data-i18n="TAB_GENERAL/LABEL_LANGUAGE_ADMIN"></label>
<div class="controls">
<div class="flag-selector">
<span class="flag-wrapper">
<span data-bind="css: 'flag flag-' + languageAdmin().toLowerCase()" style=""></span>
</span>
<span class="flag-name" tabindex="0" data-bind="text: languageAdminFullName, click: selectLanguageAdmin, onSpace: selectLanguageAdmin, onEnter: selectLanguageAdmin"></span>
&nbsp;&nbsp;
<div data-bind="component: {
name: 'SaveTrigger',
params: { value: languageAdminTrigger }
}"></div>
</div>
</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 data-bind="component: {
name: 'Checkbox',
params: {
label: 'TAB_GENERAL/LABEL_ALLOW_GRAVATAR',
value: capaGravatar,
inline: true
}
}"></div>
(<a class="g-ui-link" href="http://en.gravatar.com/" target="_blank">http://en.gravatar.com/</a>)
</div>
</div>
<div class="legend i18n i18n-animation" 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">
<div data-bind="component: {
name: 'Input',
params: {
label: 'MB',
value: mainAttachmentLimit,
trigger: attachmentLimitTrigger,
size: 1
}
}"></div>
<br />
<br />
<span class="well well-small" data-bind="visible: '' !== uploadDataDesc">
<b>PHP:</b>
&nbsp;
<span data-bind="text: uploadDataDesc"></span>
</span>
&nbsp;&nbsp;&nbsp;
<a href="#" target="_blank" class="btn btn-thin" data-bind="link: phpInfoLink()">
<i class="icon-info"></i>
</a>
</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 class="control-group">
<div class="controls">
<div data-bind="component: {
name: 'Checkbox',
params: {
label: 'TAB_GENERAL/LABEL_ALLOW_TEMPLATES',
value: capaTemplates
}
}"></div>
</div>
</div>
-->
</div>
</div>

View file

@ -16,6 +16,7 @@
<div class="b-folders-system" data-bind="template: { name: 'MailFolderListSystemItem', foreach: folderListSystem }"></div>
<hr class="b-list-delimiter" />
<div class="b-folders-user" data-bind="template: { name: 'MailFolderListItem', foreach: folderList }"></div>
<div class="move-action-content-wrapper" data-bind="visible: moveAction"></div>
</div>
</div>
</div>

View file

@ -28,6 +28,7 @@
</a>
</div>
<div class="btn-group" data-bind="visible: allowReload && mobileCheckedStateHide()">&nbsp;</div>
<!-- ko if: !newMoveToFolder() -->
<div class="btn-group dropdown colored-toggle hide-on-mobile" data-bind="visible: allowMessageListActions, registrateBootstrapDropdown: true, openDropdownTrigger: moveDropdownTrigger">
<a id="move-dropdown-id" href="#" tabindex="-1" class="btn single btn-dark-disabled-border dropdown-toggle buttonMove" data-toggle="dropdown" data-tooltip-join="top" data-bind="command: moveCommand, tooltip: 'MESSAGE_LIST/BUTTON_MOVE_TO'">
<i class="icon-copy visible-on-ctrl-btn"></i>
@ -46,6 +47,15 @@
<!-- /ko -->
</ul>
</div>
<!-- /ko -->
<!-- ko if: newMoveToFolder() -->
<div class="btn-group" data-bind="visible: allowMessageListActions && mobileCheckedStateShow()">
<a id="move-dropdown-id" href="#" tabindex="-1" class="btn single btn-dark-disabled-border buttonMove" data-tooltip-join="top" data-bind="command: moveNewCommand, tooltip: 'MESSAGE_LIST/BUTTON_MOVE_TO'">
<i class="icon-copy visible-on-ctrl-btn"></i>
<i class="icon-folder hidden-on-ctrl-btn"></i>
</a>
</div>
<!-- /ko -->
<div class="btn-group" data-bind="visible: allowMessageListActions && mobileCheckedStateHide()">&nbsp;</div>
<div class="btn-group" data-bind="visible: allowMessageListActions && mobileCheckedStateShow()">
<a class="btn first btn-dark-disabled-border button-archive" data-tooltip-join="top"