mirror of
https://git.proxmox.com/git/proxmox-widget-toolkit
synced 2025-05-22 17:17:49 +00:00

A default notification config will now be created in pve-manager's postinst hook - which is not magic in any way and can be modified and deleted as desired. Signed-off-by: Lukas Wagner <l.wagner@proxmox.com>
313 lines
6.1 KiB
JavaScript
313 lines
6.1 KiB
JavaScript
Ext.define('Proxmox.panel.NotificationConfigView', {
|
|
extend: 'Ext.panel.Panel',
|
|
alias: 'widget.pmxNotificationConfigView',
|
|
mixins: ['Proxmox.Mixin.CBind'],
|
|
layout: {
|
|
type: 'border',
|
|
},
|
|
|
|
items: [
|
|
{
|
|
region: 'center',
|
|
border: false,
|
|
xtype: 'pmxNotificationEndpointView',
|
|
cbind: {
|
|
baseUrl: '{baseUrl}',
|
|
},
|
|
},
|
|
{
|
|
region: 'south',
|
|
height: '50%',
|
|
border: false,
|
|
collapsible: true,
|
|
animCollapse: false,
|
|
xtype: 'pmxNotificationMatcherView',
|
|
cbind: {
|
|
baseUrl: '{baseUrl}',
|
|
},
|
|
},
|
|
],
|
|
});
|
|
|
|
Ext.define('Proxmox.panel.NotificationEndpointView', {
|
|
extend: 'Ext.grid.Panel',
|
|
alias: 'widget.pmxNotificationEndpointView',
|
|
|
|
title: gettext('Notification Targets'),
|
|
|
|
controller: {
|
|
xclass: 'Ext.app.ViewController',
|
|
|
|
openEditWindow: function(endpointType, endpoint) {
|
|
let me = this;
|
|
|
|
Ext.create('Proxmox.window.EndpointEditBase', {
|
|
baseUrl: me.getView().baseUrl,
|
|
type: endpointType,
|
|
|
|
name: endpoint,
|
|
autoShow: true,
|
|
listeners: {
|
|
destroy: () => me.reload(),
|
|
},
|
|
});
|
|
},
|
|
|
|
openEditForSelectedItem: function() {
|
|
let me = this;
|
|
let view = me.getView();
|
|
|
|
let selection = view.getSelection();
|
|
if (selection.length < 1) {
|
|
return;
|
|
}
|
|
|
|
me.openEditWindow(selection[0].data.type, selection[0].data.name);
|
|
},
|
|
|
|
reload: function() {
|
|
let me = this;
|
|
let view = me.getView();
|
|
view.getStore().rstore.load();
|
|
},
|
|
|
|
testEndpoint: function() {
|
|
let me = this;
|
|
let view = me.getView();
|
|
|
|
let selection = view.getSelection();
|
|
if (selection.length < 1) {
|
|
return;
|
|
}
|
|
|
|
let target = selection[0].data.name;
|
|
|
|
Ext.Msg.confirm(
|
|
gettext("Notification Target Test"),
|
|
Ext.String.format(gettext("Do you want to send a test notification to '{0}'?"), target),
|
|
function(decision) {
|
|
if (decision !== "yes") {
|
|
return;
|
|
}
|
|
|
|
Proxmox.Utils.API2Request({
|
|
method: 'POST',
|
|
url: `${view.baseUrl}/targets/${target}/test`,
|
|
|
|
success: function(response, opt) {
|
|
Ext.Msg.show({
|
|
title: gettext('Notification Target Test'),
|
|
message: Ext.String.format(
|
|
gettext("Sent test notification to '{0}'."),
|
|
target,
|
|
),
|
|
buttons: Ext.Msg.OK,
|
|
icon: Ext.Msg.INFO,
|
|
});
|
|
},
|
|
autoErrorAlert: true,
|
|
});
|
|
});
|
|
},
|
|
},
|
|
|
|
listeners: {
|
|
itemdblclick: 'openEditForSelectedItem',
|
|
activate: 'reload',
|
|
},
|
|
|
|
emptyText: gettext('No notification targets configured'),
|
|
|
|
columns: [
|
|
{
|
|
dataIndex: 'name',
|
|
text: gettext('Target Name'),
|
|
renderer: Ext.String.htmlEncode,
|
|
flex: 1,
|
|
},
|
|
{
|
|
dataIndex: 'type',
|
|
text: gettext('Type'),
|
|
renderer: Ext.String.htmlEncode,
|
|
flex: 1,
|
|
},
|
|
{
|
|
dataIndex: 'comment',
|
|
text: gettext('Comment'),
|
|
renderer: Ext.String.htmlEncode,
|
|
flex: 1,
|
|
},
|
|
],
|
|
|
|
store: {
|
|
type: 'diff',
|
|
autoDestroy: true,
|
|
autoDestroyRstore: true,
|
|
rstore: {
|
|
type: 'update',
|
|
storeid: 'proxmox-notification-endpoints',
|
|
model: 'proxmox-notification-endpoints',
|
|
autoStart: true,
|
|
},
|
|
sorters: 'name',
|
|
},
|
|
|
|
initComponent: function() {
|
|
let me = this;
|
|
|
|
if (!me.baseUrl) {
|
|
throw "baseUrl is not set!";
|
|
}
|
|
|
|
let menuItems = [];
|
|
for (const [endpointType, config] of Object.entries(
|
|
Proxmox.Schema.notificationEndpointTypes).sort()) {
|
|
menuItems.push({
|
|
text: config.name,
|
|
iconCls: 'fa fa-fw ' + (config.iconCls || 'fa-bell-o'),
|
|
handler: () => me.controller.openEditWindow(endpointType),
|
|
});
|
|
}
|
|
|
|
Ext.apply(me, {
|
|
tbar: [
|
|
{
|
|
text: gettext('Add'),
|
|
menu: menuItems,
|
|
},
|
|
{
|
|
xtype: 'proxmoxButton',
|
|
text: gettext('Modify'),
|
|
handler: 'openEditForSelectedItem',
|
|
disabled: true,
|
|
},
|
|
{
|
|
xtype: 'proxmoxStdRemoveButton',
|
|
callback: 'reload',
|
|
getUrl: function(rec) {
|
|
return `${me.baseUrl}/endpoints/${rec.data.type}/${rec.getId()}`;
|
|
},
|
|
},
|
|
'-',
|
|
{
|
|
xtype: 'proxmoxButton',
|
|
text: gettext('Test'),
|
|
handler: 'testEndpoint',
|
|
disabled: true,
|
|
},
|
|
],
|
|
});
|
|
|
|
me.callParent();
|
|
me.store.rstore.proxy.setUrl(`/api2/json/${me.baseUrl}/targets`);
|
|
},
|
|
});
|
|
|
|
Ext.define('Proxmox.panel.NotificationMatcherView', {
|
|
extend: 'Ext.grid.Panel',
|
|
alias: 'widget.pmxNotificationMatcherView',
|
|
|
|
title: gettext('Notification Matchers'),
|
|
|
|
controller: {
|
|
xclass: 'Ext.app.ViewController',
|
|
|
|
openEditWindow: function(matcher) {
|
|
let me = this;
|
|
|
|
Ext.create('Proxmox.window.NotificationMatcherEdit', {
|
|
baseUrl: me.getView().baseUrl,
|
|
name: matcher,
|
|
autoShow: true,
|
|
listeners: {
|
|
destroy: () => me.reload(),
|
|
},
|
|
});
|
|
},
|
|
|
|
openEditForSelectedItem: function() {
|
|
let me = this;
|
|
let view = me.getView();
|
|
|
|
let selection = view.getSelection();
|
|
if (selection.length < 1) {
|
|
return;
|
|
}
|
|
|
|
me.openEditWindow(selection[0].data.name);
|
|
},
|
|
|
|
reload: function() {
|
|
this.getView().getStore().rstore.load();
|
|
},
|
|
},
|
|
|
|
listeners: {
|
|
itemdblclick: 'openEditForSelectedItem',
|
|
activate: 'reload',
|
|
},
|
|
|
|
emptyText: gettext('No notification matchers configured'),
|
|
|
|
columns: [
|
|
{
|
|
dataIndex: 'name',
|
|
text: gettext('Matcher Name'),
|
|
renderer: Ext.String.htmlEncode,
|
|
flex: 1,
|
|
},
|
|
{
|
|
dataIndex: 'comment',
|
|
text: gettext('Comment'),
|
|
renderer: Ext.String.htmlEncode,
|
|
flex: 2,
|
|
},
|
|
],
|
|
|
|
store: {
|
|
type: 'diff',
|
|
autoDestroy: true,
|
|
autoDestroyRstore: true,
|
|
rstore: {
|
|
type: 'update',
|
|
storeid: 'proxmox-notification-matchers',
|
|
model: 'proxmox-notification-matchers',
|
|
autoStart: true,
|
|
},
|
|
sorters: 'name',
|
|
},
|
|
|
|
initComponent: function() {
|
|
let me = this;
|
|
|
|
if (!me.baseUrl) {
|
|
throw "baseUrl is not set!";
|
|
}
|
|
|
|
Ext.apply(me, {
|
|
tbar: [
|
|
{
|
|
xtype: 'proxmoxButton',
|
|
text: gettext('Add'),
|
|
handler: () => me.getController().openEditWindow(),
|
|
selModel: false,
|
|
},
|
|
{
|
|
xtype: 'proxmoxButton',
|
|
text: gettext('Modify'),
|
|
handler: 'openEditForSelectedItem',
|
|
disabled: true,
|
|
},
|
|
{
|
|
xtype: 'proxmoxStdRemoveButton',
|
|
callback: 'reload',
|
|
baseurl: `${me.baseUrl}/matchers`,
|
|
},
|
|
],
|
|
});
|
|
|
|
me.callParent();
|
|
me.store.rstore.proxy.setUrl(`/api2/json/${me.baseUrl}/matchers`);
|
|
},
|
|
});
|