all lists on lists.proxmox.com
 help / color / mirror / Atom feed
From: Daniel Tschlatscher <d.tschlatscher@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH widget-toolkit] fix #3971: Download and copy button in the TaskViewer
Date: Fri,  1 Apr 2022 16:07:57 +0200	[thread overview]
Message-ID: <20220401140758.1997754-1-d.tschlatscher@proxmox.com> (raw)

The taskviewer now has 2 more buttons which implement
functionality for downloading the current tasklog as a file
or copying it to the clipboard. The code for saving the log
to a file was taken from the pve System Report class and
moved to its own function in the Utils file.

Tested on Firefox 91.7.0esr and Chromium Version 99

Signed-off-by: Daniel Tschlatscher <d.tschlatscher@proxmox.com>
---
 src/Utils.js             | 17 +++++++++++
 src/window/TaskViewer.js | 65 +++++++++++++++++++++++++++++++++++++++-
 2 files changed, 81 insertions(+), 1 deletion(-)

diff --git a/src/Utils.js b/src/Utils.js
index 6a03057..3fff3da 100644
--- a/src/Utils.js
+++ b/src/Utils.js
@@ -1272,6 +1272,23 @@ utilities: {
 	    .map(val => val.charCodeAt(0)),
 	);
     },
+
+    // Convert the given string to a file and "download" it locally
+    textToFile: function(fileName, fileContent) {
+	// Internet Explorer
+	if (window.navigator.msSaveOrOpenBlob) {
+	    navigator.msSaveOrOpenBlob(new Blob([fileContent]), fileName);
+	} else {
+	    var element = document.createElement('a');
+	    element.setAttribute('href', 'data:text/plain;charset=utf-8,' +
+		encodeURIComponent(fileContent));
+	    element.setAttribute('download', fileName);
+	    element.style.display = 'none';
+	    document.body.appendChild(element);
+	    element.click();
+	    document.body.removeChild(element);
+	}
+    },
 },
 
     singleton: true,
diff --git a/src/window/TaskViewer.js b/src/window/TaskViewer.js
index 996a41b..bf4533d 100644
--- a/src/window/TaskViewer.js
+++ b/src/window/TaskViewer.js
@@ -229,13 +229,75 @@ Ext.define('Proxmox.window.TaskViewer', {
 	    border: false,
 	});
 
+	let downloadBtn = new Ext.Button({
+		text: gettext('Download'),
+	});
+
+	let copyBtn = new Ext.Button({
+		text: gettext('Copy'),
+		iconCls: 'fa fa-clipboard',
+	});
+
 	let logView = Ext.create('Proxmox.panel.LogView', {
 	    title: gettext('Output'),
-	    tbar: [stop_btn2],
+	    tbar: [stop_btn2, '->', downloadBtn, copyBtn],
 	    border: false,
 	    url: "/api2/extjs/nodes/" + task.node + "/tasks/" + encodeURIComponent(me.upid) + "/log",
 	});
 
+	const downloadLogFull = function(callback) {
+	    Proxmox.Utils.API2Request({
+		url: "/nodes/" + task.node + "/tasks/"
+		    + encodeURIComponent(me.upid) + '/log',
+		waitMsgTarget: me,
+		method: 'GET',
+		params: {
+		    'limit': logView.viewModel.data.data.total,
+		},
+		failure: function(response, opts) {
+		    callback(response.htmlStatus, null);
+		},
+		success: function(response) {
+		    let fileContent = "";
+
+		    response.result.data.forEach((line) => {
+			fileContent += `${line.t}\n`;
+		    });
+
+		    callback(null, fileContent);
+		},
+	    });
+	};
+
+	downloadBtn.handler = function() {
+	    downloadLogFull((errStatus, fileContent) => {
+		if (errStatus) {
+		    Ext.Msg.alert(gettext('Error'), errStatus);
+		} else {
+		    let record = statstore.getRecord().data;
+		    let fileName = record.user + "@" + record.node + "_" +
+			record.type + "_" + record.pid + "_" +
+			Proxmox.Utils.render_timestamp(record.starttime) +
+			"_" + record.exitstatus + ".log";
+
+		    Proxmox.Utils.textToFile(fileName, fileContent);
+		}
+	    });
+	};
+
+	copyBtn.handler = function() {
+	    downloadLogFull((errStatus, response) => {
+		if (errStatus) {
+		    Ext.Msg.alert(gettext('Error'), errStatus);
+		} else {
+		    navigator.clipboard.writeText(response)
+		    .catch((err) => {
+			Ext.Msg.alert(gettext('Error'), err);
+		    });
+		}
+	    });
+	};
+
 	me.mon(statstore, 'load', function() {
 	    let status = statgrid.getObjectValue('status');
 
@@ -248,6 +310,7 @@ Ext.define('Proxmox.window.TaskViewer', {
 
 	    stop_btn1.setDisabled(status !== 'running');
 	    stop_btn2.setDisabled(status !== 'running');
+	    downloadBtn.setDisabled(status === 'running');
 	});
 
 	statstore.startUpdate();
-- 
2.30.2





             reply	other threads:[~2022-04-01 14:09 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-01 14:07 Daniel Tschlatscher [this message]
2022-04-01 14:07 ` [pve-devel] [PATCH manager] Replaced system-report file download Daniel Tschlatscher
2022-04-01 15:20   ` Thomas Lamprecht
2022-04-01 15:18 ` [pve-devel] [PATCH widget-toolkit] fix #3971: Download and copy button in the TaskViewer Thomas Lamprecht
2022-04-04  9:25   ` Daniel Tschlatscher
     [not found]     ` <2a4863fa-2d27-f088-f381-09e02f9180c4@proxmox.com>
2022-04-04 11:58       ` Daniel Tschlatscher

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220401140758.1997754-1-d.tschlatscher@proxmox.com \
    --to=d.tschlatscher@proxmox.com \
    --cc=pve-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal