]> git.proxmox.com Git - proxmox-widget-toolkit.git/blobdiff - src/Utils.js
vlan edit: Fix automatic field disabling
[proxmox-widget-toolkit.git] / src / Utils.js
index 0691d4085d2e79b209b3243de35ed2a7a1f1cd34..af5f1db27279198b45324662d7339b9bea15edfb 100644 (file)
@@ -5,13 +5,6 @@ if (!Ext.isDefined(Proxmox.Setup.auth_cookie_name)) {
     throw "Proxmox library not initialized";
 }
 
-// avoid errors related to Accessible Rich Internet Applications
-// (access for people with disabilities)
-// TODO reenable after all components are upgraded
-Ext.enableAria = false;
-Ext.enableAriaButtons = false;
-Ext.enableAriaPanels = false;
-
 // avoid errors when running without development tools
 if (!Ext.isDefined(Ext.global.console)) {
     let console = {
@@ -74,6 +67,7 @@ utilities: {
        zh_CN: 'Chinese (Simplified)',
        zh_TW: 'Chinese (Traditional)',
        da: 'Danish',
+       nl: 'Dutch',
        en: 'English',
        eu: 'Euskera (Basque)',
        fr: 'French',
@@ -81,6 +75,7 @@ utilities: {
        he: 'Hebrew',
        it: 'Italian',
        ja: 'Japanese',
+       kr: 'Korean',
        nb: 'Norwegian (Bokmal)',
        nn: 'Norwegian (Nynorsk)',
        fa: 'Persian (Farsi)',
@@ -459,7 +454,7 @@ utilities: {
                success: function(response, opts) {
                    let res = response.result;
                    if (res === null || res === undefined || !res || res
-                       .data.status !== 'Active') {
+                       .data.status.toLowerCase() !== 'active') {
                        Ext.Msg.show({
                            title: gettext('No valid subscription'),
                            icon: Ext.Msg.WARNING,
@@ -560,93 +555,15 @@ utilities: {
     },
 
     task_desc_table: {
-       acmenewcert: ['SRV', gettext('Order Certificate')],
-       acmeregister: ['ACME Account', gettext('Register')],
-       acmedeactivate: ['ACME Account', gettext('Deactivate')],
-       acmeupdate: ['ACME Account', gettext('Update')],
-       acmerefresh: ['ACME Account', gettext('Refresh')],
-       acmerenew: ['SRV', gettext('Renew Certificate')],
-       acmerevoke: ['SRV', gettext('Revoke Certificate')],
-       'auth-realm-sync': [gettext('Realm'), gettext('Sync')],
-       'auth-realm-sync-test': [gettext('Realm'), gettext('Sync Preview')],
-       'move_volume': ['CT', gettext('Move Volume')],
-       clustercreate: ['', gettext('Create Cluster')],
-       clusterjoin: ['', gettext('Join Cluster')],
+       aptupdate: ['', gettext('Update package database')],
        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')],
-       qmreboot: ['VM', gettext('Reboot')],
-       qmsuspend: ['VM', gettext('Hibernate')],
-       qmpause: ['VM', gettext('Pause')],
-       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')],
-       vzreboot: ['CT', gettext('Reboot')],
-       vzsuspend: ['CT', gettext('Suspend')],
-       vzresume: ['CT', gettext('Resume')],
-       push_file: ['CT', gettext('Push file')],
-       pull_file: ['CT', gettext('Pull file')],
-       hamigrate: ['HA', gettext('Migrate')],
-       hastart: ['HA', gettext('Start')],
-       hastop: ['HA', gettext('Stop')],
-       hashutdown: ['HA', gettext('Shutdown')],
+       srvreload: ['SRV', gettext('Reload')],
+       srvrestart: ['SRV', gettext('Restart')],
        srvstart: ['SRV', gettext('Start')],
        srvstop: ['SRV', gettext('Stop')],
-       srvrestart: ['SRV', gettext('Restart')],
-       srvreload: ['SRV', gettext('Reload')],
-       cephcreatemgr: ['Ceph Manager', gettext('Create')],
-       cephdestroymgr: ['Ceph Manager', gettext('Destroy')],
-       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')],
-       cephfscreate: ['CephFS', gettext('Create')],
-       cephcreatemds: ['Ceph Metadata Server', gettext('Create')],
-       cephdestroymds: ['Ceph Metadata Server', gettext('Destroy')],
-       imgcopy: ['', gettext('Copy data')],
-       imgdel: ['', gettext('Erase data')],
-       unknownimgdel: ['', gettext('Destroy image from unknown guest')],
-       download: ['', gettext('Download')],
-       vzdump: (type, id) => id ? `VM/CT ${id} - ${gettext('Backup')}` : gettext('Backup Job'),
-       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')],
-       dircreate: [gettext('Directory Storage'), gettext('Create')],
-       lvmcreate: [gettext('LVM Storage'), gettext('Create')],
-       lvmthincreate: [gettext('LVM-Thin Storage'), gettext('Create')],
-       zfscreate: [gettext('ZFS Storage'), gettext('Create')],
+       termproxy: ['', gettext('Console') + ' (xterm.js)'],
+       vncshell: ['', gettext('Shell')],
     },
 
     // to add or change existing for product specific ones
@@ -708,6 +625,65 @@ utilities: {
        return Proxmox.Utils.format_duration_long(uptime);
     },
 
+    systemd_unescape: function(string_value) {
+       const charcode_0 = '0'.charCodeAt(0);
+       const charcode_9 = '9'.charCodeAt(0);
+       const charcode_A = 'A'.charCodeAt(0);
+       const charcode_F = 'F'.charCodeAt(0);
+       const charcode_a = 'a'.charCodeAt(0);
+       const charcode_f = 'f'.charCodeAt(0);
+       const charcode_x = 'x'.charCodeAt(0);
+       const charcode_minus = '-'.charCodeAt(0);
+       const charcode_slash = '/'.charCodeAt(0);
+       const charcode_backslash = '\\'.charCodeAt(0);
+
+       let parse_hex_digit = function(d) {
+           if (d >= charcode_0 && d <= charcode_9) {
+               return d - charcode_0;
+           }
+           if (d >= charcode_A && d <= charcode_F) {
+               return d - charcode_A + 10;
+           }
+           if (d >= charcode_a && d <= charcode_f) {
+               return d - charcode_a + 10;
+           }
+           throw "got invalid hex digit";
+       };
+
+       let value = new TextEncoder().encode(string_value);
+       let result = new Uint8Array(value.length);
+
+       let i = 0;
+       let result_len = 0;
+
+       while (i < value.length) {
+           let c0 = value[i];
+           if (c0 === charcode_minus) {
+               result.set([charcode_slash], result_len);
+               result_len += 1;
+               i += 1;
+               continue;
+           }
+           if ((i + 4) < value.length) {
+               let c1 = value[i+1];
+               if (c0 === charcode_backslash && c1 === charcode_x) {
+                   let h1 = parse_hex_digit(value[i+2]);
+                   let h0 = parse_hex_digit(value[i+3]);
+                   let ord = h1*16+h0;
+                   result.set([ord], result_len);
+                   result_len += 1;
+                   i += 4;
+                   continue;
+               }
+           }
+           result.set([c0], result_len);
+           result_len += 1;
+           i += 1;
+       }
+
+       return new TextDecoder().decode(result.slice(0, result.len));
+    },
+
     parse_task_upid: function(upid) {
        let task = {};
 
@@ -723,7 +699,7 @@ utilities: {
        }
        task.starttime = parseInt(res[6], 16);
        task.type = res[7];
-       task.id = res[8];
+       task.id = Proxmox.Utils.systemd_unescape(res[8]);
        task.user = res[9];
 
        task.desc = Proxmox.Utils.format_task_description(task.type, task.id);
@@ -801,11 +777,11 @@ utilities: {
        }
        // try to normalize - and _ separators, to support asciidoc and sphinx
        // references at the same time.
-       let section_minus_normalized = section.replace(/_/, '-');
+       let section_minus_normalized = section.replace(/_/g, '-');
        if (helpMap[section_minus_normalized]) {
            return helpMap[section_minus_normalized];
        }
-       let section_underscore_normalized = section.replace(/-/, '_');
+       let section_underscore_normalized = section.replace(/-/g, '_');
        return helpMap[section_underscore_normalized];
     },
 
@@ -872,13 +848,13 @@ utilities: {
        me.IP64_match = new RegExp("^(?:" + IPV6_REGEXP + "|" + IPV4_REGEXP + ")$");
        me.IP64_cidr_match = new RegExp("^(?:" + IPV6_REGEXP + "/" + IPV6_CIDR_MASK + ")|(?:" + IPV4_REGEXP + "/" + IPV4_CIDR_MASK + ")$");
 
-       let DnsName_REGEXP = "(?:(([a-zA-Z0-9]([a-zA-Z0-9\\-]*[a-zA-Z0-9])?)\\.)*([A-Za-z0-9]([A-Za-z0-9\\-]*[A-Za-z0-9])?))";
+       let DnsName_REGEXP = "(?:(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9\\-]*[a-zA-Z0-9])?)\\.)*(?:[A-Za-z0-9](?:[A-Za-z0-9\\-]*[A-Za-z0-9])?))";
        me.DnsName_match = new RegExp("^" + DnsName_REGEXP + "$");
 
-       me.HostPort_match = new RegExp("^(" + IPV4_REGEXP + "|" + DnsName_REGEXP + ")(:\\d+)?$");
-       me.HostPortBrackets_match = new RegExp("^\\[(?:" + IPV6_REGEXP + "|" + IPV4_REGEXP + "|" + DnsName_REGEXP + ")\\](:\\d+)?$");
-       me.IP6_dotnotation_match = new RegExp("^" + IPV6_REGEXP + "(\\.\\d+)?$");
-       me.Vlan_match = /^vlan(\\d+)/;
-       me.VlanInterface_match = /(\\w+)\\.(\\d+)/;
+       me.HostPort_match = new RegExp("^(" + IPV4_REGEXP + "|" + DnsName_REGEXP + ")(?::(\\d+))?$");
+       me.HostPortBrackets_match = new RegExp("^\\[(" + IPV6_REGEXP + "|" + IPV4_REGEXP + "|" + DnsName_REGEXP + ")\\](?::(\\d+))?$");
+       me.IP6_dotnotation_match = new RegExp("^(" + IPV6_REGEXP + ")(?:\\.(\\d+))?$");
+       me.Vlan_match = /^vlan(\d+)/;
+       me.VlanInterface_match = /(\w+)\.(\d+)/;
     },
 });