stateText: gettext('State'),
groupText: gettext('Group'),
- language_map: {
- ar: 'Arabic',
- ca: 'Catalan',
- zh_CN: 'Chinese (Simplified)',
- zh_TW: 'Chinese (Traditional)',
- da: 'Danish',
- nl: 'Dutch',
- en: 'English',
- eu: 'Euskera (Basque)',
- fr: 'French',
- de: 'German',
- he: 'Hebrew',
- it: 'Italian',
- ja: 'Japanese',
- kr: 'Korean',
- nb: 'Norwegian (Bokmal)',
- nn: 'Norwegian (Nynorsk)',
- fa: 'Persian (Farsi)',
- pl: 'Polish',
- pt_BR: 'Portuguese (Brazil)',
- ru: 'Russian',
- sl: 'Slovenian',
- es: 'Spanish',
- sv: 'Swedish',
- tr: 'Turkish',
+ language_map: { //language map is sorted alphabetically by iso 639-1
+ ar: `العربية - ${gettext("Arabic")}`,
+ ca: `Català - ${gettext("Catalan")}`,
+ da: `Dansk - ${gettext("Danish")}`,
+ de: `Deutsch - ${gettext("German")}`,
+ en: `English - ${gettext("English")}`,
+ es: `Español - ${gettext("Spanish")}`,
+ eu: `Euskera (Basque) - ${gettext("Euskera (Basque)")}`,
+ fa: `فارسی - ${gettext("Persian (Farsi)")}`,
+ fr: `Français - ${gettext("French")}`,
+ he: `עברית - ${gettext("Hebrew")}`,
+ it: `Italiano - ${gettext("Italian")}`,
+ ja: `日本語 - ${gettext("Japanese")}`,
+ kr: `한국어 - ${gettext("Korean")}`,
+ nb: `Bokmål - ${gettext("Norwegian (Bokmal)")}`,
+ nl: `Nederlands - ${gettext("Dutch")}`,
+ nn: `Nynorsk - ${gettext("Norwegian (Nynorsk)")}`,
+ pl: `Polski - ${gettext("Polish")}`,
+ pt_BR: `Português Brasileiro - ${gettext("Portuguese (Brazil)")}`,
+ ru: `Русский - ${gettext("Russian")}`,
+ sl: `Slovenščina - ${gettext("Slovenian")}`,
+ sv: `Svenska - ${gettext("Swedish")}`,
+ tr: `Türkçe - ${gettext("Turkish")}`,
+ zh_CN: `中文(简体)- ${gettext("Chinese (Simplified)")}`,
+ zh_TW: `中文(繁體)- ${gettext("Chinese (Traditional)")}`,
},
render_language: function(value) {
return value;
},
+ renderEnabledIcon: enabled => `<i class="fa fa-${enabled ? 'check' : 'minus'}"></i>`,
+
language_array: function() {
let data = [['__default__', Proxmox.Utils.render_language('')]];
Ext.Object.each(Proxmox.Utils.language_map, function(key, value) {
return data;
},
+ theme_map: {
+ crisp: 'Light theme',
+ "proxmox-dark": 'Proxmox Dark',
+ },
+
+ render_theme: function(value) {
+ if (!value || value === '__default__') {
+ return Proxmox.Utils.defaultText + ' (auto)';
+ }
+ let text = Proxmox.Utils.theme_map[value];
+ if (text) {
+ return text;
+ }
+ return value;
+ },
+
+ theme_array: function() {
+ let data = [['__default__', Proxmox.Utils.render_theme('')]];
+ Ext.Object.each(Proxmox.Utils.theme_map, function(key, value) {
+ data.push([key, Proxmox.Utils.render_theme(value)]);
+ });
+
+ return data;
+ },
+
bond_mode_gettext_map: {
'802.3ad': 'LACP (802.3ad)',
'lacp-balance-slb': 'LACP (balance-slb)',
if (!result.success) {
msg = gettext("Unknown error");
if (result.message) {
- msg = result.message;
+ msg = Ext.htmlEncode(result.message);
if (result.status) {
- msg += ' (' + result.status + ')';
+ msg += ` (${result.status})`;
}
}
if (verbose && Ext.isObject(result.errors)) {
msg += "<br>";
- Ext.Object.each(result.errors, function(prop, desc) {
- msg += "<br><b>" + Ext.htmlEncode(prop) + "</b>: " +
- Ext.htmlEncode(desc);
+ Ext.Object.each(result.errors, (prop, desc) => {
+ msg += `<br><b>${Ext.htmlEncode(prop)}</b>: ${Ext.htmlEncode(desc)}`;
});
}
}
waitMsg: gettext('Please wait...'),
}, reqOpts);
+ // default to enable if user isn't handling the failure already explicitly
+ let autoErrorAlert = reqOpts.autoErrorAlert ??
+ (typeof reqOpts.failure !== 'function' && typeof reqOpts.callback !== 'function');
+
if (!newopts.url.match(/^\/api2/)) {
newopts.url = '/api2/extjs' + newopts.url;
}
response.htmlStatus = Proxmox.Utils.extractRequestError(result, true);
Ext.callback(callbackFn, options.scope, [options, false, response]);
Ext.callback(failureFn, options.scope, [response, options]);
+ if (autoErrorAlert) {
+ Ext.Msg.alert(gettext('Error'), response.htmlStatus);
+ }
return;
}
Ext.callback(callbackFn, options.scope, [options, true, response]);
}
return `<span class="${cls}" style="${style}">${string}</span>`;
},
+
+ // Setting filename here when downloading from a remote url sometimes fails in chromium browsers
+ // because of a bug when using attribute download in conjunction with a self signed certificate.
+ // For more info see https://bugs.chromium.org/p/chromium/issues/detail?id=993362
+ downloadAsFile: function(source, fileName) {
+ let hiddenElement = document.createElement('a');
+ hiddenElement.href = source;
+ hiddenElement.target = '_blank';
+ if (fileName) {
+ hiddenElement.download = fileName;
+ }
+ hiddenElement.click();
+ },
},
singleton: true,
return new Promise((resolve, _reject) => setTimeout(resolve, millis));
},
});
+
+Ext.override(Ext.data.Store, {
+ // If the store's proxy is changed while it is waiting for an AJAX
+ // response, `onProxyLoad` will still be called for the outdated response.
+ // To avoid displaying inconsistent information, only process responses
+ // belonging to the current proxy.
+ onProxyLoad: function(operation) {
+ let me = this;
+ if (operation.getProxy() === me.getProxy()) {
+ me.callParent(arguments);
+ } else {
+ console.log(`ignored outdated response: ${operation.getRequest().getUrl()}`);
+ }
+ },
+});