[pbs-devel] [PATCH v3 widget-toolkit 10/10] APT repositories: add warnings
Fabian Ebner
f.ebner at proxmox.com
Mon Mar 22 12:59:45 CET 2021
Signed-off-by: Fabian Ebner <f.ebner at proxmox.com>
---
Changes from v2:
* rename globalWarning to mainWarning
* use gettext for main warnings
* use a stand-alone label component for the main warning instead of misusing
the title bar. This made it necessary to adapt the view model and the
reload functionionality, including handling of the rowBodyFeature.
* reduce capslock, since the warning is clearly visible even without.
src/node/APTRepositories.js | 172 +++++++++++++++++++++++++++++++++---
1 file changed, 161 insertions(+), 11 deletions(-)
diff --git a/src/node/APTRepositories.js b/src/node/APTRepositories.js
index 0b21a8a..d9b70be 100644
--- a/src/node/APTRepositories.js
+++ b/src/node/APTRepositories.js
@@ -14,13 +14,15 @@ Ext.define('apt-repolist', {
],
});
-Ext.define('Proxmox.node.APTRepositories', {
+Ext.define('Proxmox.node.APTRepositoriesGrid', {
extend: 'Ext.grid.GridPanel',
- xtype: 'proxmoxNodeAPTRepositories',
+ xtype: 'proxmoxNodeAPTRepositoriesGrid',
sortableColumns: false,
+ rowBodyFeature: undefined,
+
columns: [
{
header: gettext('Enabled'),
@@ -94,6 +96,78 @@ Ext.define('Proxmox.node.APTRepositories', {
},
],
+ check_repositories: function() {
+ let me = this;
+ let vm = me.up('proxmoxNodeAPTRepositories').getViewModel();
+
+ Proxmox.Utils.API2Request({
+ url: `/nodes/${me.nodename}/apt/checkrepositories`,
+ method: 'GET',
+ failure: function(response, opts) {
+ Ext.Msg.alert(gettext('Error'), response.htmlStatus);
+ },
+ success: function(response, opts) {
+ const data = response.result.data;
+
+ vm.set('enterpriseRepo', data.enterprise);
+ vm.set('noSubscriptionRepo', data.nosubscription);
+
+ let warnings = {};
+ for (const warning of data.warnings) {
+ const key = `${warning.Path}:${warning.Number}`;
+ if (warnings[key]) {
+ warnings[key] += "\n";
+ warnings[key] += "Warning: " + warning.Warning;
+ } else {
+ warnings[key] = "Warning: " + warning.Warning;
+ }
+ }
+
+ me.rowBodyFeature.getAdditionalData = function(innerData, rowIndex, record, orig) {
+ let headerCt = this.view.headerCt;
+ let colspan = headerCt.getColumnCount();
+
+ const key = `${innerData.Path}:${innerData.Number}`;
+ const warning_text = warnings[key];
+
+ return {
+ rowBody: '<div style="color: red; white-space: pre-line">' +
+ Ext.String.htmlEncode(warning_text) +
+ '</div>',
+ rowBodyCls: warning_text ? '' : Ext.baseCSSPrefix + 'grid-row-body-hidden',
+ rowBodyColspan: colspan,
+ };
+ };
+ },
+ });
+ },
+
+ check_subscription: function() {
+ let me = this;
+ let vm = me.up('proxmoxNodeAPTRepositories').getViewModel();
+
+ Proxmox.Utils.API2Request({
+ url: `/nodes/${me.nodename}/subscription`,
+ method: 'GET',
+ failure: function(response, opts) {
+ Ext.Msg.alert(gettext('Error'), response.htmlStatus);
+ },
+ success: function(response, opts) {
+ const res = response.result;
+ const subscription = !(res === null || res === undefined ||
+ !res || res.data.status.toLowerCase() !== 'active');
+ vm.set('subscriptionActive', subscription);
+ },
+ });
+ },
+
+ reload: function() {
+ let me = this;
+ me.store.load();
+ me.check_repositories();
+ me.check_subscription();
+ },
+
initComponent: function() {
let me = this;
@@ -116,29 +190,105 @@ Ext.define('Proxmox.node.APTRepositories', {
],
});
+ let rowBodyFeature = Ext.create('Ext.grid.feature.RowBody', {});
+ me.rowBodyFeature = rowBodyFeature;
+
let groupingFeature = Ext.create('Ext.grid.feature.Grouping', {
groupHeaderTpl: '{[ "File: " + values.name ]} ({rows.length} ' +
'repositor{[values.rows.length > 1 ? "ies" : "y"]})',
enableGroupingMenu: false,
});
- let reload = function() {
- store.load();
- };
-
let sm = Ext.create('Ext.selection.RowModel', {});
Ext.apply(me, {
store: store,
selModel: sm,
- features: [groupingFeature],
- listeners: {
- activate: reload,
- },
+ features: [groupingFeature, me.rowBodyFeature],
});
Proxmox.Utils.monStoreErrors(me, store, true);
- reload();
+ me.reload();
+
+ me.callParent();
+ },
+});
+
+Ext.define('Proxmox.node.APTRepositories', {
+ extend: 'Ext.panel.Panel',
+
+ xtype: 'proxmoxNodeAPTRepositories',
+ mixins: ['Proxmox.Mixin.CBind'],
+
+ viewModel: {
+ data: {
+ subscriptionActive: '',
+ noSubscriptionRepo: '',
+ enterpriseRepo: '',
+ },
+ formulas: {
+ mainWarning: function(get) {
+ if (get('subscriptionActive') === '' ||
+ get('noSubscriptionRepo') === '' ||
+ get('enterpriseRepo') === '') {
+ return '';
+ }
+
+ const warn = gettext('Warning') + ': ';
+
+ if (!get('subscriptionActive') && get('enterpriseRepo')) {
+ return warn + gettext('The enterprise repository is ' +
+ 'configured, but there is no active subscription!');
+ }
+
+ if (get('noSubscriptionRepo')) {
+ return warn + gettext('The no-subscription repository is ' +
+ 'not recommended for production use!');
+ }
+
+ if (!get('enterpriseRepo') && !get('noSubscriptionRepo')) {
+ return warn + gettext('Neither the enterprise repository ' +
+ 'nor the no-subscription repository is configured!');
+ }
+
+ return '';
+ },
+ },
+ },
+
+ items: [
+ {
+ xtype: 'label',
+ name: 'mainWarning',
+ cls: 'fa fa-exclamation-triangle',
+ style: 'color:red;',
+ bind: {
+ text: '{mainWarning}',
+ hidden: '{!mainWarning}',
+ },
+ },
+ {
+ xtype: 'proxmoxNodeAPTRepositoriesGrid',
+ name: 'repoGrid',
+ cbind: {
+ nodename: '{nodename}',
+ },
+ },
+ ],
+
+ listeners: {
+ activate: function() {
+ let me = this;
+ me.down('proxmoxNodeAPTRepositoriesGrid').reload();
+ },
+ },
+
+ initComponent: function() {
+ let me = this;
+
+ if (!me.nodename) {
+ throw "no node name specified";
+ }
me.callParent();
},
--
2.20.1
More information about the pbs-devel
mailing list