Restructure Capa

This commit is contained in:
the-djmaze 2022-02-24 12:22:27 +01:00
parent 5990addfef
commit e7c7b8ed53
15 changed files with 74 additions and 140 deletions

View file

@ -4,23 +4,16 @@
* @enum {string} * @enum {string}
*/ */
export const Capa = { export const Capa = {
GnuPG: 'GNUPG', AdditionalAccounts: 'AdditionalAccounts',
OpenPGP: 'OPEN_PGP', AutoLogout: 'AutoLogout',
Prefetch: 'PREFETCH', DangerousActions: 'DangerousActions',
Contacts: 'CONTACTS', GnuPG: 'GnuPG',
Search: 'SEARCH', Identities: 'Identities',
SearchAdv: 'SEARCH_ADV', OpenPGP: 'OpenPGP',
MessageActions: 'MESSAGE_ACTIONS', Search: 'Search',
AttachmentsActions: 'ATTACHMENTS_ACTIONS', SearchAdv: 'SearchAdv',
DangerousActions: 'DANGEROUS_ACTIONS', Themes: 'Themes',
Themes: 'THEMES', UserBackground: 'UserBackground'
UserBackground: 'USER_BACKGROUND',
Sieve: 'SIEVE',
AttachmentThumbnails: 'ATTACHMENT_THUMBNAILS',
AutoLogout: 'AUTOLOGOUT',
Kolab: 'KOLAB',
AdditionalAccounts: 'ADDITIONAL_ACCOUNTS',
Identities: 'IDENTITIES'
}; };
/** /**

View file

@ -43,7 +43,7 @@ export class SettingsUserScreen extends AbstractSettingsScreen {
); );
} }
if (SettingsCapa(Capa.Sieve)) { if (SettingsCapa('Sieve')) {
settingsAddViewModel(FiltersUserSettings, 'SettingsFilters', 'SETTINGS_LABELS/LABEL_FILTERS_NAME', 'filters'); settingsAddViewModel(FiltersUserSettings, 'SettingsFilters', 'SETTINGS_LABELS/LABEL_FILTERS_NAME', 'filters');
} }

View file

@ -46,7 +46,7 @@ export class GeneralAdminSettings /*extends AbstractViewSettings*/ {
capaUserBackground: SettingsCapa(Capa.UserBackground), capaUserBackground: SettingsCapa(Capa.UserBackground),
capaAdditionalAccounts: SettingsCapa(Capa.AdditionalAccounts), capaAdditionalAccounts: SettingsCapa(Capa.AdditionalAccounts),
capaIdentities: SettingsCapa(Capa.Identities), capaIdentities: SettingsCapa(Capa.Identities),
capaAttachmentThumbnails: SettingsCapa(Capa.AttachmentThumbnails), capaAttachmentThumbnails: SettingsCapa('AttachmentThumbnails'),
dataFolderAccess: false dataFolderAccess: false
}); });

View file

@ -1,5 +1,5 @@
import { Capa } from 'Common/Enums'; import { Capa } from 'Common/Enums';
import { Settings, SettingsGet } from 'Common/Globals'; import { SettingsGet, SettingsCapa } from 'Common/Globals';
import { addObservablesTo, addSubscribablesTo } from 'External/ko'; import { addObservablesTo, addSubscribablesTo } from 'External/ko';
import Remote from 'Remote/Admin/Fetch'; import Remote from 'Remote/Admin/Fetch';
@ -27,7 +27,7 @@ export class SecurityAdminSettings /*extends AbstractViewSettings*/ {
adminPasswordUpdateError: false, adminPasswordUpdateError: false,
adminPasswordUpdateSuccess: false, adminPasswordUpdateSuccess: false,
capaOpenPGP: Settings.capa(Capa.OpenPGP) capaOpenPGP: SettingsCapa(Capa.OpenPGP)
}); });
addSubscribablesTo(this, { addSubscribablesTo(this, {

View file

@ -3,11 +3,10 @@ import { koComputable } from 'External/ko';
import { Notification } from 'Common/Enums'; import { Notification } from 'Common/Enums';
import { FolderMetadataKeys } from 'Common/EnumsUser'; import { FolderMetadataKeys } from 'Common/EnumsUser';
import { Settings } from 'Common/Globals'; import { SettingsCapa } from 'Common/Globals';
import { getNotification } from 'Common/Translator'; import { getNotification } from 'Common/Translator';
import { setFolder, getFolderFromCacheList, removeFolderFromCacheList } from 'Common/Cache'; import { setFolder, getFolderFromCacheList, removeFolderFromCacheList } from 'Common/Cache';
import { Capa } from 'Common/Enums';
import { defaultOptionsAfterRender } from 'Common/Utils'; import { defaultOptionsAfterRender } from 'Common/Utils';
import { sortFolders } from 'Common/Folders'; import { sortFolders } from 'Common/Folders';
import { initOnStartOrLangChange, i18n } from 'Common/Translator'; import { initOnStartOrLangChange, i18n } from 'Common/Translator';
@ -27,7 +26,7 @@ const folderForDeletion = ko.observable(null).askDeleteHelper();
export class FoldersUserSettings /*extends AbstractViewSettings*/ { export class FoldersUserSettings /*extends AbstractViewSettings*/ {
constructor() { constructor() {
this.showKolab = koComputable(() => FolderUserStore.hasCapability('METADATA') && Settings.capa(Capa.Kolab)); this.showKolab = koComputable(() => FolderUserStore.hasCapability('METADATA') && SettingsCapa('Kolab'));
this.defaultOptionsAfterRender = defaultOptionsAfterRender; this.defaultOptionsAfterRender = defaultOptionsAfterRender;
this.kolabTypeOptions = ko.observableArray(); this.kolabTypeOptions = ko.observableArray();
let i18nFilter = key => i18n('SETTINGS_FOLDERS/TYPE_' + key); let i18nFilter = key => i18n('SETTINGS_FOLDERS/TYPE_' + key);

View file

@ -3,7 +3,7 @@ import { koComputable } from 'External/ko';
import { pInt, settingsSaveHelperSimpleFunction } from 'Common/Utils'; import { pInt, settingsSaveHelperSimpleFunction } from 'Common/Utils';
import { Capa, SaveSettingsStep } from 'Common/Enums'; import { Capa, SaveSettingsStep } from 'Common/Enums';
import { Settings } from 'Common/Globals'; import { SettingsCapa } from 'Common/Globals';
import { i18n, trigger as translatorTrigger } from 'Common/Translator'; import { i18n, trigger as translatorTrigger } from 'Common/Translator';
import { SettingsUserStore } from 'Stores/User/Settings'; import { SettingsUserStore } from 'Stores/User/Settings';
@ -12,7 +12,7 @@ import Remote from 'Remote/User/Fetch';
export class SecurityUserSettings /*extends AbstractViewSettings*/ { export class SecurityUserSettings /*extends AbstractViewSettings*/ {
constructor() { constructor() {
this.capaAutoLogout = Settings.capa(Capa.AutoLogout); this.capaAutoLogout = SettingsCapa(Capa.AutoLogout);
this.autoLogout = SettingsUserStore.autoLogout; this.autoLogout = SettingsUserStore.autoLogout;
this.autoLogoutTrigger = ko.observable(SaveSettingsStep.Idle); this.autoLogoutTrigger = ko.observable(SaveSettingsStep.Idle);

View file

@ -4,7 +4,7 @@ import { SaveSettingsStep, UploadErrorCode, Capa } from 'Common/Enums';
import { changeTheme, convertThemeName } from 'Common/Utils'; import { changeTheme, convertThemeName } from 'Common/Utils';
import { themePreviewLink, serverRequest } from 'Common/Links'; import { themePreviewLink, serverRequest } from 'Common/Links';
import { i18n } from 'Common/Translator'; import { i18n } from 'Common/Translator';
import { Settings } from 'Common/Globals'; import { SettingsCapa } from 'Common/Globals';
import { ThemeStore } from 'Stores/Theme'; import { ThemeStore } from 'Stores/Theme';
@ -26,10 +26,9 @@ export class ThemesUserSettings /*extends AbstractViewSettings*/ {
this.themes = ThemeStore.themes; this.themes = ThemeStore.themes;
this.themesObjects = ko.observableArray(); this.themesObjects = ko.observableArray();
themeBackground.enabled = SettingsCapa(Capa.UserBackground);
this.background = themeBackground; this.background = themeBackground;
this.capaUserBackground = Settings.capa(Capa.UserBackground);
this.themeTrigger = ko.observable(SaveSettingsStep.Idle).extend({ debounce: 100 }); this.themeTrigger = ko.observable(SaveSettingsStep.Idle).extend({ debounce: 100 });
ThemeStore.theme.subscribe(value => { ThemeStore.theme.subscribe(value => {
@ -59,7 +58,7 @@ export class ThemesUserSettings /*extends AbstractViewSettings*/ {
// initUploader // initUploader
if (themeBackground.uploaderButton() && this.capaUserBackground) { if (themeBackground.uploaderButton() && themeBackground.enabled) {
const oJua = new Jua({ const oJua = new Jua({
action: serverRequest('UploadBackground'), action: serverRequest('UploadBackground'),
limit: 1, limit: 1,
@ -112,7 +111,7 @@ export class ThemesUserSettings /*extends AbstractViewSettings*/ {
} }
clearBackground() { clearBackground() {
if (this.capaUserBackground) { if (themeBackground.enabled) {
Remote.request('ClearUserBackground', () => { Remote.request('ClearUserBackground', () => {
themeBackground.name(''); themeBackground.name('');
themeBackground.hash(''); themeBackground.hash('');

View file

@ -8,7 +8,7 @@ import { IdentityUserStore } from 'Stores/User/Identity';
import { AbstractViewPopup } from 'Knoin/AbstractViews'; import { AbstractViewPopup } from 'Knoin/AbstractViews';
import { Capa } from 'Common/Enums'; import { Capa } from 'Common/Enums';
import { Settings } from 'Common/Globals'; import { SettingsCapa } from 'Common/Globals';
export class OpenPgpGeneratePopupView extends AbstractViewPopup { export class OpenPgpGeneratePopupView extends AbstractViewPopup {
constructor() { constructor() {
@ -34,7 +34,7 @@ export class OpenPgpGeneratePopupView extends AbstractViewPopup {
saveGnuPGPrivate: false saveGnuPGPrivate: false
}); });
this.canGnuPG = Settings.capa(Capa.GnuPG); this.canGnuPG = SettingsCapa(Capa.GnuPG);
this.email.subscribe(() => this.emailError(false)); this.email.subscribe(() => this.emailError(false));
} }

View file

@ -828,7 +828,7 @@ export class MailMessageList extends AbstractViewRight {
shortcuts.add('arrowleft', 'meta', Scope.MessageView, ()=>false); shortcuts.add('arrowleft', 'meta', Scope.MessageView, ()=>false);
shortcuts.add('arrowright', 'meta', Scope.MessageView, ()=>false); shortcuts.add('arrowright', 'meta', Scope.MessageView, ()=>false);
if (!ThemeStore.isMobile() && SettingsCapa(Capa.Prefetch)) { if (!ThemeStore.isMobile() && SettingsCapa('Prefetch')) {
ifvisible.idle(this.prefetchNextTick.bind(this)); ifvisible.idle(this.prefetchNextTick.bind(this));
} }
} }

View file

@ -2,10 +2,7 @@ import ko from 'ko';
import { UNUSED_OPTION_VALUE } from 'Common/Consts'; import { UNUSED_OPTION_VALUE } from 'Common/Consts';
import { import { Scope } from 'Common/Enums';
Capa,
Scope
} from 'Common/Enums';
import { import {
ComposeType, ComposeType,
@ -93,7 +90,7 @@ export class MailMessageView extends AbstractViewRight {
this.moveAction = moveAction; this.moveAction = moveAction;
this.allowMessageActions = SettingsCapa(Capa.MessageActions); this.allowMessageActions = SettingsCapa('MessageActions');
const attachmentsActions = Settings.app('attachmentsActions'); const attachmentsActions = Settings.app('attachmentsActions');
this.attachmentsActions = ko.observableArray(arrayLength(attachmentsActions) ? attachmentsActions : []); this.attachmentsActions = ko.observableArray(arrayLength(attachmentsActions) ? attachmentsActions : []);
@ -132,7 +129,7 @@ export class MailMessageView extends AbstractViewRight {
this.viewHash = ''; this.viewHash = '';
this.addComputables({ this.addComputables({
allowAttachmentControls: () => this.attachmentsActions.length && SettingsCapa(Capa.AttachmentsActions), allowAttachmentControls: () => this.attachmentsActions.length && SettingsCapa('AttachmentsActions'),
downloadAsZipAllowed: () => this.attachmentsActions.includes('zip') && this.allowAttachmentControls(), downloadAsZipAllowed: () => this.attachmentsActions.includes('zip') && this.allowAttachmentControls(),

View file

@ -13,7 +13,7 @@ import { KeyboardShortcutsHelpPopupView } from 'View/Popup/KeyboardShortcutsHelp
import { AccountPopupView } from 'View/Popup/Account'; import { AccountPopupView } from 'View/Popup/Account';
import { ContactsPopupView } from 'View/Popup/Contacts'; import { ContactsPopupView } from 'View/Popup/Contacts';
import { doc, Settings/*, SettingsGet*/, leftPanelDisabled, fireEvent } from 'Common/Globals'; import { doc, leftPanelDisabled, fireEvent, SettingsCapa } from 'Common/Globals';
import { ThemeStore } from 'Stores/Theme'; import { ThemeStore } from 'Stores/Theme';
@ -26,7 +26,7 @@ export class SystemDropDownUserView extends AbstractViewRight {
constructor() { constructor() {
super('SystemDropDown'); super('SystemDropDown');
this.allowAccounts = Settings.capa(Capa.AdditionalAccounts); this.allowAccounts = SettingsCapa(Capa.AdditionalAccounts);
this.accountEmail = AccountUserStore.email; this.accountEmail = AccountUserStore.email;

View file

@ -45,7 +45,7 @@ win.rl = {
get: name => RL_APP_DATA[name], get: name => RL_APP_DATA[name],
set: (name, value) => RL_APP_DATA[name] = value, set: (name, value) => RL_APP_DATA[name] = value,
app: name => RL_APP_DATA.System[name], app: name => RL_APP_DATA.System[name],
capa: name => name && (RL_APP_DATA.Capa || []).includes(name) capa: name => name && !!(RL_APP_DATA.Capa || {})[name]
}, },
setWindowTitle: title => setWindowTitle: title =>
doc.title = RL_APP_DATA.Title ? (title ? title + ' - ' : '') + RL_APP_DATA.Title : (title ? '' + title : ''), doc.title = RL_APP_DATA.Title ? (title ? title + ' - ' : '') + RL_APP_DATA.Title : (title ? '' + title : ''),

View file

@ -1165,89 +1165,36 @@ class Actions
public function Capa(bool $bAdmin, ?Model\Account $oAccount = null): array public function Capa(bool $bAdmin, ?Model\Account $oAccount = null): array
{ {
static $aResult; static $aResult;
if ($aResult && !$oAccount) { if (!$aResult) {
return $aResult; $oConfig = $this->oConfig;
$aResult = array(
'AutoLogout' => true,
'AdditionalAccounts' => (bool) $oConfig->Get('webmail', 'allow_additional_accounts', false),
'AttachmentThumbnails' => (bool) $oConfig->Get('interface', 'show_attachment_thumbnail', true),
'AttachmentsActions' => (bool) $oConfig->Get('capa', 'attachments_actions', false),
'Contacts' => (bool) $oConfig->Get('capa', 'contacts', true),
'DangerousActions' => (bool) $oConfig->Get('capa', 'dangerous_actions', true),
'GnuPG' => (bool) $oConfig->Get('security', 'openpgp', false) && \SnappyMail\PGP\GnuPG::isSupported(),
'Identities' => (bool) $oConfig->Get('webmail', 'allow_additional_identities', false),
'Kolab' => (bool) $oConfig->Get('labs', 'kolab_enabled', false),
'MessageActions' => (bool) $oConfig->Get('capa', 'message_actions', true),
'OpenPGP' => (bool) $oConfig->Get('security', 'openpgp', false),
'Prefetch' => (bool) $oConfig->Get('labs', 'allow_prefetch', false),
'Quota' => (bool) $oConfig->Get('capa', 'quota', true),
'Search' => (bool) $oConfig->Get('capa', 'search', true),
'SearchAdv' => (bool) $oConfig->Get('capa', 'search', true) && $oConfig->Get('capa', 'search_adv', true),
'Sieve' => false,
'Themes' => (bool) $oConfig->Get('webmail', 'allow_themes', false),
'UserBackground' => (bool) $oConfig->Get('webmail', 'allow_user_background', false)
);
} }
$aResult['Sieve'] = $bAdmin || ($oAccount && $oAccount->Domain()->UseSieve());
$oConfig = $this->oConfig;
$aResult = array(
Enumerations\Capa::AUTOLOGOUT
);
if ($oConfig->Get('capa', 'dangerous_actions', true)) {
$aResult[] = Enumerations\Capa::DANGEROUS_ACTIONS;
}
if ($oConfig->Get('capa', 'quota', true)) {
$aResult[] = Enumerations\Capa::QUOTA;
}
if ($oConfig->Get('webmail', 'allow_additional_accounts', false)) {
$aResult[] = Enumerations\Capa::ADDITIONAL_ACCOUNTS;
}
if ($oConfig->Get('webmail', 'allow_additional_identities', false)) {
$aResult[] = Enumerations\Capa::IDENTITIES;
}
if ($oConfig->Get('webmail', 'allow_themes', false)) {
$aResult[] = Enumerations\Capa::THEMES;
}
if ($oConfig->Get('webmail', 'allow_user_background', false)) {
$aResult[] = Enumerations\Capa::USER_BACKGROUND;
}
if ($oConfig->Get('security', 'openpgp', false)) {
$aResult[] = Enumerations\Capa::OPEN_PGP;
if (\SnappyMail\PGP\GnuPG::isSupported()) {
$aResult[] = Enumerations\Capa::GNUPG;
}
}
if ($bAdmin || ($oAccount && $oAccount->Domain()->UseSieve())) {
$aResult[] = Enumerations\Capa::SIEVE;
}
if ($oConfig->Get('capa', 'attachments_actions', false)) {
$aResult[] = Enumerations\Capa::ATTACHMENTS_ACTIONS;
}
if ($oConfig->Get('capa', 'message_actions', true)) {
$aResult[] = Enumerations\Capa::MESSAGE_ACTIONS;
}
if ($oConfig->Get('capa', 'contacts', true)) {
$aResult[] = Enumerations\Capa::CONTACTS;
}
if ($oConfig->Get('capa', 'search', true)) {
$aResult[] = Enumerations\Capa::SEARCH;
if ($oConfig->Get('capa', 'search_adv', true)) {
$aResult[] = Enumerations\Capa::SEARCH_ADV;
}
}
if ($oConfig->Get('interface', 'show_attachment_thumbnail', true)) {
$aResult[] = Enumerations\Capa::ATTACHMENT_THUMBNAILS;
}
if ($oConfig->Get('labs', 'allow_prefetch', false)) {
$aResult[] = Enumerations\Capa::PREFETCH;
}
if ($oConfig->Get('labs', 'kolab_enabled', false)) {
$aResult[] = Enumerations\Capa::KOLAB;
}
return $aResult; return $aResult;
} }
public function GetCapa(string $sName, ?Model\Account $oAccount = null): bool public function GetCapa(string $sName, ?Model\Account $oAccount = null): bool
{ {
return \in_array($sName, $this->Capa(false, $oAccount)); return !empty($this->Capa(false, $oAccount)[$sName]);
} }
public function etag(string $sKey): string public function etag(string $sKey): string

View file

@ -4,23 +4,22 @@ namespace RainLoop\Enumerations;
class Capa class Capa
{ {
const GNUPG = 'GNUPG'; const GNUPG = 'GnuPG';
const OPEN_PGP = 'OPEN_PGP'; const OPEN_PGP = 'OpenPGP';
const PREFETCH = 'PREFETCH'; const PREFETCH = 'Prefetch';
const THEMES = 'THEMES'; const THEMES = 'Themes';
const USER_BACKGROUND = 'USER_BACKGROUND'; const USER_BACKGROUND = 'UserBackground';
const SIEVE = 'SIEVE'; const SIEVE = 'Sieve';
const ATTACHMENT_THUMBNAILS = 'ATTACHMENT_THUMBNAILS'; const ATTACHMENT_THUMBNAILS = 'AttachmentThumbnails';
const ADDITIONAL_ACCOUNTS = 'ADDITIONAL_ACCOUNTS'; const ADDITIONAL_ACCOUNTS = 'AdditionalAccounts';
const IDENTITIES = 'IDENTITIES'; const IDENTITIES = 'Identities';
const CONTACTS = 'CONTACTS'; const CONTACTS = 'Contacts';
const SEARCH = 'SEARCH'; const SEARCH = 'Search';
const SEARCH_ADV = 'SEARCH_ADV'; const SEARCH_ADV = 'SearchAdv';
const QUOTA = 'QUOTA'; const QUOTA = 'Quota';
const TEMPLATES = 'TEMPLATES'; const MESSAGE_ACTIONS = 'MessageActions';
const MESSAGE_ACTIONS = 'MESSAGE_ACTIONS'; const ATTACHMENTS_ACTIONS = 'AttachmentsActions';
const ATTACHMENTS_ACTIONS = 'ATTACHMENTS_ACTIONS'; const DANGEROUS_ACTIONS = 'DangerousActions';
const DANGEROUS_ACTIONS = 'DANGEROUS_ACTIONS'; const AUTOLOGOUT = 'AutoLogout';
const AUTOLOGOUT = 'AUTOLOGOUT'; const KOLAB = 'Kolab';
const KOLAB = 'KOLAB';
} }

View file

@ -10,7 +10,7 @@
</div> </div>
<br> <br>
<br> <br>
<div class="form-horizontal" data-bind="visible: capaUserBackground"> <div class="form-horizontal" data-bind="visible: background.enabled">
<div class="legend" data-i18n="SETTINGS_THEMES/LEGEND_THEMES_CUSTOM"></div> <div class="legend" data-i18n="SETTINGS_THEMES/LEGEND_THEMES_CUSTOM"></div>
<div class="control-group g-ui-user-select-none"> <div class="control-group g-ui-user-select-none">
<div class="row" data-bind="visible: '' !== background.error()" style="margin-left: 0; margin-bottom: 10px;"> <div class="row" data-bind="visible: '' !== background.error()" style="margin-left: 0; margin-bottom: 10px;">