mirror of
https://git.proxmox.com/git/proxmox-widget-toolkit
synced 2025-05-22 22:00:18 +00:00
panel: notification: add gui for SMTP endpoints
This new endpoint configuration panel is embedded in the existing EndpointEditBase dialog window. This commit also factors out some of the non-trivial common form elements that are shared between the new panel and the already existing SendmailEditPanel into a separate panel EmailRecipientPanel. Signed-off-by: Lukas Wagner <l.wagner@proxmox.com>
This commit is contained in:
parent
de0cec409a
commit
3003f37779
@ -71,7 +71,9 @@ JSSRC= \
|
|||||||
panel/ACMEAccount.js \
|
panel/ACMEAccount.js \
|
||||||
panel/ACMEPlugin.js \
|
panel/ACMEPlugin.js \
|
||||||
panel/ACMEDomains.js \
|
panel/ACMEDomains.js \
|
||||||
|
panel/EmailRecipientPanel.js \
|
||||||
panel/SendmailEditPanel.js \
|
panel/SendmailEditPanel.js \
|
||||||
|
panel/SmtpEditPanel.js \
|
||||||
panel/StatusView.js \
|
panel/StatusView.js \
|
||||||
panel/TfaView.js \
|
panel/TfaView.js \
|
||||||
panel/NotesView.js \
|
panel/NotesView.js \
|
||||||
|
@ -43,6 +43,11 @@ Ext.define('Proxmox.Schema', { // a singleton
|
|||||||
ipanel: 'pmxSendmailEditPanel',
|
ipanel: 'pmxSendmailEditPanel',
|
||||||
iconCls: 'fa-envelope-o',
|
iconCls: 'fa-envelope-o',
|
||||||
},
|
},
|
||||||
|
smtp: {
|
||||||
|
name: gettext('SMTP'),
|
||||||
|
ipanel: 'pmxSmtpEditPanel',
|
||||||
|
iconCls: 'fa-envelope-o',
|
||||||
|
},
|
||||||
gotify: {
|
gotify: {
|
||||||
name: 'Gotify',
|
name: 'Gotify',
|
||||||
ipanel: 'pmxGotifyEditPanel',
|
ipanel: 'pmxGotifyEditPanel',
|
||||||
|
88
src/panel/EmailRecipientPanel.js
Normal file
88
src/panel/EmailRecipientPanel.js
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
Ext.define('Proxmox.panel.EmailRecipientPanel', {
|
||||||
|
extend: 'Ext.panel.Panel',
|
||||||
|
xtype: 'pmxEmailRecipientPanel',
|
||||||
|
mixins: ['Proxmox.Mixin.CBind'],
|
||||||
|
border: false,
|
||||||
|
|
||||||
|
mailValidator: function() {
|
||||||
|
let mailto_user = this.down(`[name=mailto-user]`);
|
||||||
|
let mailto = this.down(`[name=mailto]`);
|
||||||
|
|
||||||
|
if (!mailto_user.getValue()?.length && !mailto.getValue()) {
|
||||||
|
return gettext('Either mailto or mailto-user must be set');
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
layout: 'anchor',
|
||||||
|
border: false,
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
xtype: 'pmxUserSelector',
|
||||||
|
name: 'mailto-user',
|
||||||
|
multiSelect: true,
|
||||||
|
allowBlank: true,
|
||||||
|
editable: false,
|
||||||
|
skipEmptyText: true,
|
||||||
|
fieldLabel: gettext('Recipient(s)'),
|
||||||
|
cbind: {
|
||||||
|
deleteEmpty: '{!isCreate}',
|
||||||
|
},
|
||||||
|
validator: function() {
|
||||||
|
return this.up('pmxEmailRecipientPanel').mailValidator();
|
||||||
|
},
|
||||||
|
autoEl: {
|
||||||
|
tag: 'div',
|
||||||
|
'data-qtip': gettext('The notification will be sent to the user\'s configured mail address'),
|
||||||
|
},
|
||||||
|
listConfig: {
|
||||||
|
width: 600,
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
header: gettext('User'),
|
||||||
|
sortable: true,
|
||||||
|
dataIndex: 'userid',
|
||||||
|
renderer: Ext.String.htmlEncode,
|
||||||
|
flex: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header: gettext('E-Mail'),
|
||||||
|
sortable: true,
|
||||||
|
dataIndex: 'email',
|
||||||
|
renderer: Ext.String.htmlEncode,
|
||||||
|
flex: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header: gettext('Comment'),
|
||||||
|
sortable: false,
|
||||||
|
dataIndex: 'comment',
|
||||||
|
renderer: Ext.String.htmlEncode,
|
||||||
|
flex: 1,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
xtype: 'proxmoxtextfield',
|
||||||
|
fieldLabel: gettext('Additional Recipient(s)'),
|
||||||
|
name: 'mailto',
|
||||||
|
allowBlank: true,
|
||||||
|
emptyText: 'user@example.com, ...',
|
||||||
|
cbind: {
|
||||||
|
deleteEmpty: '{!isCreate}',
|
||||||
|
},
|
||||||
|
autoEl: {
|
||||||
|
tag: 'div',
|
||||||
|
'data-qtip': gettext('Multiple recipients must be separated by spaces, commas or semicolons'),
|
||||||
|
},
|
||||||
|
validator: function() {
|
||||||
|
return this.up('pmxEmailRecipientPanel').mailValidator();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
@ -28,62 +28,10 @@ Ext.define('Proxmox.panel.SendmailEditPanel', {
|
|||||||
allowBlank: false,
|
allowBlank: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
xtype: 'pmxUserSelector',
|
// provides 'mailto' and 'mailto-user' fields
|
||||||
name: 'mailto-user',
|
xtype: 'pmxEmailRecipientPanel',
|
||||||
reference: 'mailto-user',
|
|
||||||
multiSelect: true,
|
|
||||||
allowBlank: true,
|
|
||||||
editable: false,
|
|
||||||
skipEmptyText: true,
|
|
||||||
fieldLabel: gettext('User(s)'),
|
|
||||||
cbind: {
|
cbind: {
|
||||||
deleteEmpty: '{!isCreate}',
|
isCreate: '{isCreate}',
|
||||||
},
|
|
||||||
validator: function() {
|
|
||||||
return this.up('pmxSendmailEditPanel').mailValidator();
|
|
||||||
},
|
|
||||||
listConfig: {
|
|
||||||
width: 600,
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
header: gettext('User'),
|
|
||||||
sortable: true,
|
|
||||||
dataIndex: 'userid',
|
|
||||||
renderer: Ext.String.htmlEncode,
|
|
||||||
flex: 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
header: gettext('E-Mail'),
|
|
||||||
sortable: true,
|
|
||||||
dataIndex: 'email',
|
|
||||||
renderer: Ext.String.htmlEncode,
|
|
||||||
flex: 1,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
header: gettext('Comment'),
|
|
||||||
sortable: false,
|
|
||||||
dataIndex: 'comment',
|
|
||||||
renderer: Ext.String.htmlEncode,
|
|
||||||
flex: 1,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
xtype: 'proxmoxtextfield',
|
|
||||||
fieldLabel: gettext('Additional Recipient(s)'),
|
|
||||||
name: 'mailto',
|
|
||||||
reference: 'mailto',
|
|
||||||
allowBlank: true,
|
|
||||||
cbind: {
|
|
||||||
deleteEmpty: '{!isCreate}',
|
|
||||||
},
|
|
||||||
autoEl: {
|
|
||||||
tag: 'div',
|
|
||||||
'data-qtip': gettext('Multiple recipients must be separated by spaces, commas or semicolons'),
|
|
||||||
},
|
|
||||||
validator: function() {
|
|
||||||
return this.up('pmxSendmailEditPanel').mailValidator();
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
183
src/panel/SmtpEditPanel.js
Normal file
183
src/panel/SmtpEditPanel.js
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
Ext.define('Proxmox.panel.SmtpEditPanel', {
|
||||||
|
extend: 'Proxmox.panel.InputPanel',
|
||||||
|
xtype: 'pmxSmtpEditPanel',
|
||||||
|
mixins: ['Proxmox.Mixin.CBind'],
|
||||||
|
|
||||||
|
type: 'smtp',
|
||||||
|
|
||||||
|
viewModel: {
|
||||||
|
xtype: 'viewmodel',
|
||||||
|
cbind: {
|
||||||
|
isCreate: "{isCreate}",
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
mode: 'tls',
|
||||||
|
authentication: true,
|
||||||
|
},
|
||||||
|
formulas: {
|
||||||
|
portEmptyText: function(get) {
|
||||||
|
let port;
|
||||||
|
|
||||||
|
switch (get('mode')) {
|
||||||
|
case 'insecure':
|
||||||
|
port = 25;
|
||||||
|
break;
|
||||||
|
case 'starttls':
|
||||||
|
port = 587;
|
||||||
|
break;
|
||||||
|
case 'tls':
|
||||||
|
port = 465;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return `${Proxmox.Utils.defaultText} (${port})`;
|
||||||
|
},
|
||||||
|
passwordEmptyText: function(get) {
|
||||||
|
let isCreate = this.isCreate;
|
||||||
|
return get('authentication') && !isCreate ? gettext('Unchanged') : '';
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
columnT: [
|
||||||
|
{
|
||||||
|
xtype: 'pmxDisplayEditField',
|
||||||
|
name: 'name',
|
||||||
|
cbind: {
|
||||||
|
value: '{name}',
|
||||||
|
editable: '{isCreate}',
|
||||||
|
},
|
||||||
|
fieldLabel: gettext('Endpoint Name'),
|
||||||
|
allowBlank: false,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
|
||||||
|
column1: [
|
||||||
|
{
|
||||||
|
xtype: 'proxmoxtextfield',
|
||||||
|
fieldLabel: gettext('Server'),
|
||||||
|
name: 'server',
|
||||||
|
allowBlank: false,
|
||||||
|
emptyText: gettext('mail.example.com'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
xtype: 'proxmoxKVComboBox',
|
||||||
|
name: 'mode',
|
||||||
|
fieldLabel: gettext('Encryption'),
|
||||||
|
editable: false,
|
||||||
|
comboItems: [
|
||||||
|
['insecure', Proxmox.Utils.noneText + ' (' + gettext('insecure') + ')'],
|
||||||
|
['starttls', 'STARTTLS'],
|
||||||
|
['tls', 'TLS'],
|
||||||
|
],
|
||||||
|
bind: "{mode}",
|
||||||
|
cbind: {
|
||||||
|
deleteEmpty: '{!isCreate}',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
xtype: 'proxmoxintegerfield',
|
||||||
|
name: 'port',
|
||||||
|
fieldLabel: gettext('Port'),
|
||||||
|
minValue: 1,
|
||||||
|
maxValue: 65535,
|
||||||
|
bind: {
|
||||||
|
emptyText: "{portEmptyText}",
|
||||||
|
},
|
||||||
|
submitEmptyText: false,
|
||||||
|
cbind: {
|
||||||
|
deleteEmpty: '{!isCreate}',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
column2: [
|
||||||
|
{
|
||||||
|
xtype: 'proxmoxcheckbox',
|
||||||
|
fieldLabel: gettext('Authenticate'),
|
||||||
|
name: 'authentication',
|
||||||
|
bind: {
|
||||||
|
value: '{authentication}',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
xtype: 'proxmoxtextfield',
|
||||||
|
fieldLabel: gettext('Username'),
|
||||||
|
name: 'username',
|
||||||
|
allowBlank: false,
|
||||||
|
cbind: {
|
||||||
|
deleteEmpty: '{!isCreate}',
|
||||||
|
},
|
||||||
|
bind: {
|
||||||
|
disabled: '{!authentication}',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
xtype: 'proxmoxtextfield',
|
||||||
|
inputType: 'password',
|
||||||
|
fieldLabel: gettext('Password'),
|
||||||
|
name: 'password',
|
||||||
|
allowBlank: true,
|
||||||
|
bind: {
|
||||||
|
disabled: '{!authentication}',
|
||||||
|
emptyText: '{passwordEmptyText}',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
columnB: [
|
||||||
|
{
|
||||||
|
xtype: 'proxmoxtextfield',
|
||||||
|
fieldLabel: gettext('From Address'),
|
||||||
|
name: 'from-address',
|
||||||
|
allowBlank: false,
|
||||||
|
emptyText: gettext('user@example.com'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// provides 'mailto' and 'mailto-user' fields
|
||||||
|
xtype: 'pmxEmailRecipientPanel',
|
||||||
|
cbind: {
|
||||||
|
isCreate: '{isCreate}',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
xtype: 'proxmoxtextfield',
|
||||||
|
name: 'comment',
|
||||||
|
fieldLabel: gettext('Comment'),
|
||||||
|
cbind: {
|
||||||
|
deleteEmpty: '{!isCreate}',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
|
||||||
|
advancedColumnB: [
|
||||||
|
{
|
||||||
|
xtype: 'proxmoxtextfield',
|
||||||
|
fieldLabel: gettext('Author'),
|
||||||
|
name: 'author',
|
||||||
|
allowBlank: true,
|
||||||
|
emptyText: gettext('Proxmox VE'),
|
||||||
|
cbind: {
|
||||||
|
deleteEmpty: '{!isCreate}',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
|
||||||
|
onGetValues: function(values) {
|
||||||
|
if (values.mailto) {
|
||||||
|
values.mailto = values.mailto.split(/[\s,;]+/);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!values.authentication && !this.isCreate) {
|
||||||
|
Proxmox.Utils.assemble_field_data(values, { 'delete': 'username' });
|
||||||
|
Proxmox.Utils.assemble_field_data(values, { 'delete': 'password' });
|
||||||
|
}
|
||||||
|
|
||||||
|
delete values.authentication;
|
||||||
|
|
||||||
|
return values;
|
||||||
|
},
|
||||||
|
|
||||||
|
onSetValues: function(values) {
|
||||||
|
values.authentication = !!values.username;
|
||||||
|
|
||||||
|
return values;
|
||||||
|
},
|
||||||
|
});
|
Loading…
Reference in New Issue
Block a user