snappymail/dev/View/Popup/Domain.js

286 lines
6.6 KiB
JavaScript
Raw Normal View History

2022-02-24 20:36:57 +08:00
import { pInt, forEachObjectEntry } from 'Common/Utils';
import { i18n, getNotification } from 'Common/Translator';
2016-06-30 08:02:45 +08:00
import Remote from 'Remote/Admin/Fetch';
2016-06-30 08:02:45 +08:00
import { decorateKoCommands } from 'Knoin/Knoin';
import { AbstractViewPopup } from 'Knoin/AbstractViews';
import { DomainAdminStore } from 'Stores/Admin/Domain';
2021-12-03 07:11:19 +08:00
const domainToParams = oDomain => ({
Name: oDomain.name(),
2022-02-24 19:43:44 +08:00
IncHost: oDomain.imapHost(),
2021-12-03 07:11:19 +08:00
IncPort: oDomain.imapPort(),
IncSecure: oDomain.imapSecure(),
UseSieve: oDomain.useSieve() ? 1 : 0,
2022-02-24 19:43:44 +08:00
SieveHost: oDomain.sieveHost(),
2021-12-03 07:11:19 +08:00
SievePort: oDomain.sievePort(),
SieveSecure: oDomain.sieveSecure(),
2022-02-24 19:43:44 +08:00
OutHost: oDomain.smtpHost(),
2021-12-03 07:11:19 +08:00
OutPort: oDomain.smtpPort(),
OutSecure: oDomain.smtpSecure(),
OutAuth: oDomain.smtpAuth() ? 1 : 0,
OutUsePhpMail: oDomain.smtpPhpMail() ? 1 : 0
});
class DomainPopupView extends AbstractViewPopup {
constructor() {
super('Domain');
2021-08-20 21:40:07 +08:00
this.addObservables(this.getDefaults());
this.addObservables({
edit: false,
2021-08-20 21:40:07 +08:00
saving: false,
testing: false,
testingDone: false,
testingImapError: false,
testingSieveError: false,
testingSmtpError: false,
testingImapErrorDesc: '',
testingSieveErrorDesc: '',
testingSmtpErrorDesc: '',
2022-02-24 19:43:44 +08:00
imapHostFocus: false,
sieveHostFocus: false,
smtpHostFocus: false,
});
this.addComputables({
headerText: () => {
const name = this.name(),
aliasName = this.aliasName();
let result = '';
if (this.edit()) {
result = i18n('POPUPS_DOMAIN/TITLE_EDIT_DOMAIN', { NAME: name });
if (aliasName) {
result += ' ← ' + aliasName;
}
} else {
result = name
? i18n('POPUPS_DOMAIN/TITLE_ADD_DOMAIN_WITH_NAME', { NAME: name })
: i18n('POPUPS_DOMAIN/TITLE_ADD_DOMAIN');
}
return result;
},
domainDesc: () => {
const name = this.name();
return !this.edit() && name ? i18n('POPUPS_DOMAIN/NEW_DOMAIN_DESC', { NAME: '*@' + name }) : '';
},
domainIsComputed: () => {
const usePhpMail = this.smtpPhpMail(),
useSieve = this.useSieve();
return (
this.name() &&
2022-02-24 19:43:44 +08:00
this.imapHost() &&
this.imapPort() &&
2022-02-24 19:43:44 +08:00
(useSieve ? this.sieveHost() && this.sievePort() : true) &&
((this.smtpHost() && this.smtpPort()) || usePhpMail)
);
},
canBeTested: () => !this.testing() && this.domainIsComputed(),
canBeSaved: () => !this.saving() && this.domainIsComputed()
});
this.addSubscribables({
testingImapError: value => value || this.testingImapErrorDesc(''),
testingSieveError: value => value || this.testingSieveErrorDesc(''),
testingSmtpError: value => value || this.testingSmtpErrorDesc(''),
// smart form improvements
2022-02-24 19:43:44 +08:00
imapHostFocus: value =>
value && this.name() && !this.imapHost() && this.imapHost(this.name().replace(/[.]?[*][.]?/g, '')),
2022-02-24 19:43:44 +08:00
sieveHostFocus: value =>
value && this.imapHost() && !this.sieveHost() && this.sieveHost(this.imapHost()),
2022-02-24 19:43:44 +08:00
smtpHostFocus: value => value && this.imapHost() && !this.smtpHost()
&& this.smtpHost(this.imapHost().replace(/imap/gi, 'smtp')),
imapSecure: value => {
if (this.enableSmartPorts()) {
const port = pInt(this.imapPort());
2022-02-24 20:36:57 +08:00
switch (pInt(value)) {
case 0:
case 2:
if (993 === port) {
2022-02-24 20:36:57 +08:00
this.imapPort(143);
}
break;
2022-02-24 20:36:57 +08:00
case 1:
if (143 === port) {
2022-02-24 20:36:57 +08:00
this.imapPort(993);
}
break;
// no default
}
}
},
smtpSecure: value => {
if (this.enableSmartPorts()) {
const port = pInt(this.smtpPort());
2022-02-24 20:36:57 +08:00
switch (pInt(value)) {
case 0:
if (465 === port || 587 === port) {
2022-02-24 20:36:57 +08:00
this.smtpPort(25);
}
break;
2022-02-24 20:36:57 +08:00
case 1:
if (25 === port || 587 === port) {
2022-02-24 20:36:57 +08:00
this.smtpPort(465);
}
break;
2022-02-24 20:36:57 +08:00
case 2:
if (25 === port || 465 === port) {
2022-02-24 20:36:57 +08:00
this.smtpPort(587);
}
break;
// no default
}
}
}
});
decorateKoCommands(this, {
createOrAddCommand: self => self.canBeSaved(),
2021-08-27 02:31:38 +08:00
testConnectionCommand: self => self.canBeTested()
});
}
2015-01-29 00:27:23 +08:00
2016-09-10 06:38:16 +08:00
createOrAddCommand() {
this.saving(true);
2021-12-03 07:11:19 +08:00
Remote.request('AdminDomainSave',
this.onDomainCreateOrSaveResponse.bind(this),
2021-12-03 07:11:19 +08:00
Object.assign(domainToParams(this), {
Create: this.edit() ? 0 : 1,
IncShortLogin: this.imapShortLogin() ? 1 : 0,
OutShortLogin: this.smtpShortLogin() ? 1 : 0,
OutSetSender: this.smtpSetSender() ? 1 : 0,
WhiteList: this.whiteList()
})
2016-09-10 06:38:16 +08:00
);
}
testConnectionCommand() {
2022-02-24 20:36:57 +08:00
this.clearTesting(false);
2016-09-10 06:38:16 +08:00
this.testing(true);
2021-12-03 07:11:19 +08:00
Remote.request('AdminDomainTest',
2021-04-23 16:47:24 +08:00
(iError, oData) => {
this.testing(false);
if (iError) {
this.testingImapError(true);
this.testingSieveError(true);
this.testingSmtpError(true);
} else {
this.testingDone(true);
this.testingImapError(true !== oData.Result.Imap);
this.testingSieveError(true !== oData.Result.Sieve);
this.testingSmtpError(true !== oData.Result.Smtp);
if (this.testingImapError() && oData.Result.Imap) {
this.testingImapErrorDesc('');
this.testingImapErrorDesc(oData.Result.Imap);
}
if (this.testingSieveError() && oData.Result.Sieve) {
this.testingSieveErrorDesc('');
this.testingSieveErrorDesc(oData.Result.Sieve);
}
if (this.testingSmtpError() && oData.Result.Smtp) {
this.testingSmtpErrorDesc('');
this.testingSmtpErrorDesc(oData.Result.Smtp);
}
}
},
2021-12-03 07:11:19 +08:00
domainToParams(this)
2016-09-10 06:38:16 +08:00
);
}
onDomainCreateOrSaveResponse(iError) {
this.saving(false);
if (iError) {
this.savingError(getNotification(iError));
2019-07-05 03:19:24 +08:00
} else {
DomainAdminStore.fetch();
this.closeCommand();
2016-06-30 08:02:45 +08:00
}
}
clearTesting() {
this.testing(false);
this.testingDone(false);
this.testingImapError(false);
this.testingSieveError(false);
this.testingSmtpError(false);
}
onShow(oDomain) {
this.saving(false);
this.clearTesting();
this.clearForm();
2019-07-05 03:19:24 +08:00
if (oDomain) {
this.enableSmartPorts(false);
this.edit(true);
2022-02-24 20:36:57 +08:00
forEachObjectEntry(oDomain, (key, value) => this[key] && this[key](value));
this.enableSmartPorts(true);
}
2016-06-30 08:02:45 +08:00
}
2014-08-21 23:08:34 +08:00
2021-08-20 21:40:07 +08:00
getDefaults() {
return {
2022-02-24 20:36:57 +08:00
enableSmartPorts: false,
2021-08-20 21:40:07 +08:00
savingError: '',
2021-08-20 21:40:07 +08:00
name: '',
2022-02-24 19:43:44 +08:00
imapHost: '',
2022-02-24 20:36:57 +08:00
imapPort: 143,
2021-08-20 21:40:07 +08:00
imapSecure: 0,
imapShortLogin: false,
2021-08-20 21:40:07 +08:00
useSieve: false,
2022-02-24 19:43:44 +08:00
sieveHost: '',
2022-02-24 20:36:57 +08:00
sievePort: 4190,
2021-08-20 21:40:07 +08:00
sieveSecure: 0,
2014-11-20 05:32:20 +08:00
2022-02-24 19:43:44 +08:00
smtpHost: '',
2022-02-24 20:36:57 +08:00
smtpPort: 25,
2021-08-20 21:40:07 +08:00
smtpSecure: 0,
smtpShortLogin: false,
smtpAuth: true,
smtpSetSender: false,
smtpPhpMail: false,
2014-11-20 05:32:20 +08:00
2021-08-20 21:40:07 +08:00
whiteList: '',
2022-02-24 20:36:57 +08:00
aliasName: ''
2021-08-20 21:40:07 +08:00
};
}
2021-08-20 21:40:07 +08:00
clearForm() {
this.edit(false);
forEachObjectEntry(this.getDefaults(), (key, value) => this[key](value));
this.enableSmartPorts(true);
}
}
2019-07-05 03:19:24 +08:00
export { DomainPopupView, DomainPopupView as default };