X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=Utils.js;h=1fd63348e07ec0e13aad4fecc2286b48ef673eed;hb=a498f279919655ba774cc59bb9319c0dc0b33e7e;hp=3e264c5c1feff930368ec0b39e8698d1129242b8;hpb=a58001ddfc146cf84ba2933d9d08566a9b57cdfe;p=proxmox-widget-toolkit.git diff --git a/Utils.js b/Utils.js index 3e264c5..1fd6334 100644 --- a/Utils.js +++ b/Utils.js @@ -1,10 +1,6 @@ Ext.ns('Proxmox'); Ext.ns('Proxmox.Setup'); -// TODO: implement gettext -function gettext(buf) { return buf; } - - if (!Ext.isDefined(Proxmox.Setup.auth_cookie_name)) { throw "Proxmox library not initialized"; } @@ -41,7 +37,146 @@ Ext.define('Proxmox.Utils', { utilities: { // this singleton contains miscellaneous utilities + yesText: gettext('Yes'), + noText: gettext('No'), + enabledText: gettext('Enabled'), + disabledText: gettext('Disabled'), + noneText: gettext('none'), + errorText: gettext('Error'), unknownText: gettext('Unknown'), + defaultText: gettext('Default'), + daysText: gettext('days'), + dayText: gettext('day'), + runningText: gettext('running'), + stoppedText: gettext('stopped'), + neverText: gettext('never'), + totalText: gettext('Total'), + usedText: gettext('Used'), + directoryText: gettext('Directory'), + stateText: gettext('State'), + groupText: gettext('Group'), + + language_map: { + zh_CN: 'Chinese', + ca: 'Catalan', + da: 'Danish', + en: 'English', + eu: 'Euskera (Basque)', + fr: 'French', + de: 'German', + it: 'Italian', + es: 'Spanish', + ja: 'Japanese', + nb: 'Norwegian (Bokmal)', + nn: 'Norwegian (Nynorsk)', + fa: 'Persian (Farsi)', + pl: 'Polish', + pt_BR: 'Portuguese (Brazil)', + ru: 'Russian', + sl: 'Slovenian', + sv: 'Swedish', + tr: 'Turkish' + }, + + render_language: function (value) { + if (!value) { + return Proxmox.Utils.defaultText + ' (English)'; + } + var text = Proxmox.Utils.language_map[value]; + if (text) { + return text + ' (' + value + ')'; + } + return value; + }, + + language_array: function() { + var data = [['__default__', Proxmox.Utils.render_language('')]]; + Ext.Object.each(Proxmox.Utils.language_map, function(key, value) { + data.push([key, Proxmox.Utils.render_language(value)]); + }); + + return data; + }, + + getNoSubKeyHtml: function(url) { + // url http://www.proxmox.com/products/proxmox-ve/subscription-service-plans + return Ext.String.format('You do not have a valid subscription for this server. Please visit www.proxmox.com to get a list of available options.', url || 'http://www.proxmox.com'); + }, + + format_boolean_with_default: function(value) { + if (Ext.isDefined(value) && value !== '__default__') { + return value ? Proxmox.Utils.yesText : Proxmox.Utils.noText; + } + return Proxmox.Utils.defaultText; + }, + + format_boolean: function(value) { + return value ? Proxmox.Utils.yesText : Proxmox.Utils.noText; + }, + + format_neg_boolean: function(value) { + return !value ? Proxmox.Utils.yesText : Proxmox.Utils.noText; + }, + + format_enabled_toggle: function(value) { + return value ? Proxmox.Utils.enabledText : Proxmox.Utils.disabledText; + }, + + format_expire: function(date) { + if (!date) { + return Proxmox.Utils.neverText; + } + return Ext.Date.format(date, "Y-m-d"); + }, + + format_duration_long: function(ut) { + + var days = Math.floor(ut / 86400); + ut -= days*86400; + var hours = Math.floor(ut / 3600); + ut -= hours*3600; + var mins = Math.floor(ut / 60); + ut -= mins*60; + + var hours_str = '00' + hours.toString(); + hours_str = hours_str.substr(hours_str.length - 2); + var mins_str = "00" + mins.toString(); + mins_str = mins_str.substr(mins_str.length - 2); + var ut_str = "00" + ut.toString(); + ut_str = ut_str.substr(ut_str.length - 2); + + if (days) { + var ds = days > 1 ? Proxmox.Utils.daysText : Proxmox.Utils.dayText; + return days.toString() + ' ' + ds + ' ' + + hours_str + ':' + mins_str + ':' + ut_str; + } else { + return hours_str + ':' + mins_str + ':' + ut_str; + } + }, + + format_subscription_level: function(level) { + if (level === 'c') { + return 'Community'; + } else if (level === 'b') { + return 'Basic'; + } else if (level === 's') { + return 'Standard'; + } else if (level === 'p') { + return 'Premium'; + } else { + return Proxmox.Utils.noneText; + } + }, + + compute_min_label_width: function(text, width) { + + if (width === undefined) { width = 100; } + + var tm = new Ext.util.TextMetrics(); + var min = tm.getWidth(text + ':'); + + return min < width ? width : min; + }, authOK: function() { return (Proxmox.UserName !== '') && Ext.util.Cookies.get(Proxmox.Setup.auth_cookie_name); @@ -69,13 +204,19 @@ Ext.define('Proxmox.Utils', { utilities: { } }, - monStoreErrors: function(me, store) { - me.mon(store, 'beforeload', function(s, operation, eOpts) { - if (!me.loadCount) { - me.loadCount = 0; // make sure it is numeric - Proxmox.Utils.setErrorMask(me, true); - } - }); + monStoreErrors: function(me, store, clearMaskBeforeLoad) { + if (clearMaskBeforeLoad) { + me.mon(store, 'beforeload', function(s, operation, eOpts) { + Proxmox.Utils.setErrorMask(me, false); + }); + } else { + me.mon(store, 'beforeload', function(s, operation, eOpts) { + if (!me.loadCount) { + me.loadCount = 0; // make sure it is numeric + Proxmox.Utils.setErrorMask(me, true); + } + }); + } // only works with 'proxmox' proxy me.mon(store.proxy, 'afterload', function(proxy, request, success) { @@ -138,7 +279,11 @@ Ext.define('Proxmox.Utils', { utilities: { Ext.apply(newopts, { success: function(response, options) { if (options.waitMsgTarget) { - options.waitMsgTarget.setLoading(false); + if (Proxmox.Utils.toolkit === 'touch') { + options.waitMsgTarget.setMasked(false); + } else { + options.waitMsgTarget.setLoading(false); + } } var result = Ext.decode(response.responseText); response.result = result; @@ -153,7 +298,11 @@ Ext.define('Proxmox.Utils', { utilities: { }, failure: function(response, options) { if (options.waitMsgTarget) { - options.waitMsgTarget.setLoading(false); + if (Proxmox.Utils.toolkit === 'touch') { + options.waitMsgTarget.setMasked(false); + } else { + options.waitMsgTarget.setLoading(false); + } } response.result = {}; try { @@ -178,12 +327,47 @@ Ext.define('Proxmox.Utils', { utilities: { var target = newopts.waitMsgTarget; if (target) { - // Note: ExtJS bug - this does not work when component is not rendered - target.setLoading(newopts.waitMsg); + if (Proxmox.Utils.toolkit === 'touch') { + target.setMasked({ xtype: 'loadmask', message: newopts.waitMsg} ); + } else { + // Note: ExtJS bug - this does not work when component is not rendered + target.setLoading(newopts.waitMsg); + } } Ext.Ajax.request(newopts); }, + checked_command: function(orig_cmd) { + Proxmox.Utils.API2Request({ + url: '/nodes/localhost/subscription', + method: 'GET', + //waitMsgTarget: me, + failure: function(response, opts) { + Ext.Msg.alert(gettext('Error'), response.htmlStatus); + }, + success: function(response, opts) { + var data = response.result.data; + + if (data.status !== 'Active') { + Ext.Msg.show({ + title: gettext('No valid subscription'), + icon: Ext.Msg.WARNING, + msg: Proxmox.Utils.getNoSubKeyHtml(data.url), + buttons: Ext.Msg.OK, + callback: function(btn) { + if (btn !== 'ok') { + return; + } + orig_cmd(); + } + }); + } else { + orig_cmd(); + } + } + }); + }, + assemble_field_data: function(values, data) { if (Ext.isObject(data)) { Ext.Object.each(data, function(name, val) { @@ -231,9 +415,96 @@ Ext.define('Proxmox.Utils', { utilities: { Proxmox.Utils.unknownText; }, - // you can override this to provide nicer task descriptions + task_desc_table: { + diskinit: [ 'Disk', gettext('Initialize Disk with GPT') ], + vncproxy: [ 'VM/CT', gettext('Console') ], + spiceproxy: [ 'VM/CT', gettext('Console') + ' (Spice)' ], + vncshell: [ '', gettext('Shell') ], + spiceshell: [ '', gettext('Shell') + ' (Spice)' ], + qmsnapshot: [ 'VM', gettext('Snapshot') ], + qmrollback: [ 'VM', gettext('Rollback') ], + qmdelsnapshot: [ 'VM', gettext('Delete Snapshot') ], + qmcreate: [ 'VM', gettext('Create') ], + qmrestore: [ 'VM', gettext('Restore') ], + qmdestroy: [ 'VM', gettext('Destroy') ], + qmigrate: [ 'VM', gettext('Migrate') ], + qmclone: [ 'VM', gettext('Clone') ], + qmmove: [ 'VM', gettext('Move disk') ], + qmtemplate: [ 'VM', gettext('Convert to template') ], + qmstart: [ 'VM', gettext('Start') ], + qmstop: [ 'VM', gettext('Stop') ], + qmreset: [ 'VM', gettext('Reset') ], + qmshutdown: [ 'VM', gettext('Shutdown') ], + qmsuspend: [ 'VM', gettext('Suspend') ], + qmresume: [ 'VM', gettext('Resume') ], + qmconfig: [ 'VM', gettext('Configure') ], + vzsnapshot: [ 'CT', gettext('Snapshot') ], + vzrollback: [ 'CT', gettext('Rollback') ], + vzdelsnapshot: [ 'CT', gettext('Delete Snapshot') ], + vzcreate: ['CT', gettext('Create') ], + vzrestore: ['CT', gettext('Restore') ], + vzdestroy: ['CT', gettext('Destroy') ], + vzmigrate: [ 'CT', gettext('Migrate') ], + vzclone: [ 'CT', gettext('Clone') ], + vztemplate: [ 'CT', gettext('Convert to template') ], + vzstart: ['CT', gettext('Start') ], + vzstop: ['CT', gettext('Stop') ], + vzmount: ['CT', gettext('Mount') ], + vzumount: ['CT', gettext('Unmount') ], + vzshutdown: ['CT', gettext('Shutdown') ], + vzsuspend: [ 'CT', gettext('Suspend') ], + vzresume: [ 'CT', gettext('Resume') ], + hamigrate: [ 'HA', gettext('Migrate') ], + hastart: [ 'HA', gettext('Start') ], + hastop: [ 'HA', gettext('Stop') ], + srvstart: ['SRV', gettext('Start') ], + srvstop: ['SRV', gettext('Stop') ], + srvrestart: ['SRV', gettext('Restart') ], + srvreload: ['SRV', gettext('Reload') ], + cephcreatemon: ['Ceph Monitor', gettext('Create') ], + cephdestroymon: ['Ceph Monitor', gettext('Destroy') ], + cephcreateosd: ['Ceph OSD', gettext('Create') ], + cephdestroyosd: ['Ceph OSD', gettext('Destroy') ], + cephcreatepool: ['Ceph Pool', gettext('Create') ], + cephdestroypool: ['Ceph Pool', gettext('Destroy') ], + imgcopy: ['', gettext('Copy data') ], + imgdel: ['', gettext('Erase data') ], + download: ['', gettext('Download') ], + vzdump: ['', gettext('Backup') ], + aptupdate: ['', gettext('Update package database') ], + startall: [ '', gettext('Start all VMs and Containers') ], + stopall: [ '', gettext('Stop all VMs and Containers') ], + migrateall: [ '', gettext('Migrate all VMs and Containers') ] + }, + format_task_description: function(type, id) { - return type + ' ' + id; + var farray = Proxmox.Utils.task_desc_table[type]; + if (!farray) { + var text = type; + if (id) { + type += ' ' + id; + } + return text; + } + var prefix = farray[0]; + var text = farray[1]; + if (prefix) { + return prefix + ' ' + id + ' - ' + text; + } + return text; + }, + + format_size: function(size) { + /*jslint confusion: true */ + + var units = ['', 'Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi', 'Yi']; + var num = 0; + + while (size >= 1024 && ((num++)+1) < units.length) { + size = size / 1024; + } + + return size.toFixed((num > 0)?2:0) + " " + units[num] + "B"; }, render_upid: function(value, metaData, record) { @@ -243,6 +514,21 @@ Ext.define('Proxmox.Utils', { utilities: { return Proxmox.Utils.format_task_description(type, id); }, + render_uptime: function(value) { + + var uptime = value; + + if (uptime === undefined) { + return ''; + } + + if (uptime <= 0) { + return '-'; + } + + return Proxmox.Utils.format_duration_long(uptime); + }, + parse_task_upid: function(upid) { var task = {}; @@ -268,7 +554,19 @@ Ext.define('Proxmox.Utils', { utilities: { return Ext.Date.format(servertime, 'Y-m-d H:i:s'); }, - }, + openXtermJsViewer: function(vmtype, vmid, nodename, vmname) { + var url = Ext.urlEncode({ + console: vmtype, // kvm, lxc, upgrade or shell + xtermjs: 1, + vmid: vmid, + vmname: vmname, + node: nodename + }); + var nw = window.open("?" + url, '_blank', 'toolbar=no,location=no,status=no,menubar=no,resizable=yes,width=800,height=420'); + nw.focus(); + } + +}, singleton: true, constructor: function() {