]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/window/UploadToStorage.js
1 Ext
.define('PVE.window.UploadToStorage', {
2 extend
: 'Ext.window.Window',
3 alias
: 'widget.pveStorageUpload',
4 mixins
: ['Proxmox.Mixin.CBind'],
9 title
: gettext('Upload'),
12 iso
: ['.img', '.iso'],
13 vztmpl
: ['.tar.gz', '.tar.xz'],
16 cbindData: function(initialConfig
) {
18 const ext
= me
.acceptedExtensions
[me
.content
] || [];
20 me
.url
= `/nodes/${me.nodename}/storage/${me.storage}/upload`;
23 extensions
: ext
.join(', '),
36 submit: function(button
) {
37 const view
= this.getView();
38 const form
= this.lookup('formPanel').getForm();
39 const abortBtn
= this.lookup('abortBtn');
40 const pbar
= this.lookup('progressBar');
42 const updateProgress = function(per
, bytes
) {
43 let text
= (per
* 100).toFixed(2) + '%';
45 text
+= " (" + Proxmox
.Utils
.format_size(bytes
) + ')';
47 pbar
.updateProgress(per
, text
);
50 const fd
= new FormData();
52 button
.setDisabled(true);
53 abortBtn
.setDisabled(false);
55 fd
.append("content", view
.content
);
57 const fileField
= form
.findField('file');
58 const file
= fileField
.fileInputEl
.dom
.files
[0];
59 fileField
.setDisabled(true);
61 const filenameField
= form
.findField('filename');
62 const filename
= filenameField
.getValue();
63 filenameField
.setDisabled(true);
65 const algorithmField
= form
.findField('checksum-algorithm');
66 algorithmField
.setDisabled(true);
67 if (algorithmField
.getValue() !== '__default__') {
68 fd
.append("checksum-algorithm", algorithmField
.getValue());
70 const checksumField
= form
.findField('checksum');
71 fd
.append("checksum", checksumField
.getValue());
72 checksumField
.setDisabled(true);
75 fd
.append("filename", file
, filename
);
77 pbar
.setVisible(true);
80 const xhr
= new XMLHttpRequest();
83 xhr
.addEventListener("load", function(e
) {
84 if (xhr
.status
=== 200) {
88 const err
= Ext
.htmlEncode(xhr
.statusText
);
89 let msg
= `${gettext('Error')} ${xhr.status.toString()}: ${err}`;
90 if (xhr
.responseText
!== "") {
91 const result
= Ext
.decode(xhr
.responseText
);
93 msg
= Proxmox
.Utils
.extractRequestError(result
, true);
95 Ext
.Msg
.alert(gettext('Error'), msg
, btn
=> view
.close());
98 xhr
.addEventListener("error", function(e
) {
99 const err
= e
.target
.status
.toString();
100 const msg
= `Error '${err}' occurred while receiving the document.`;
101 Ext
.Msg
.alert(gettext('Error'), msg
, btn
=> view
.close());
104 xhr
.upload
.addEventListener("progress", function(evt
) {
105 if (evt
.lengthComputable
) {
106 const percentComplete
= evt
.loaded
/ evt
.total
;
107 updateProgress(percentComplete
, evt
.loaded
);
111 xhr
.open("POST", `/api2/json${view.url}`, true);
115 validitychange: function(f
, valid
) {
116 const submitBtn
= this.lookup('submitBtn');
117 submitBtn
.setDisabled(!valid
);
120 fileChange: function(input
) {
121 const vm
= this.getViewModel();
122 const name
= input
.value
.replace(/^.*(\/|\\)/, '');
123 const fileInput
= input
.fileInputEl
.dom
;
124 vm
.set('filename', name
);
125 vm
.set('size', (fileInput
.files
[0] && Proxmox
.Utils
.format_size(fileInput
.files
[0].size
)) || '-');
126 vm
.set('mimetype', (fileInput
.files
[0] && fileInput
.files
[0].type
) || '-');
129 hashChange: function(field
, value
) {
130 const checksum
= this.lookup('downloadUrlChecksum');
131 if (value
=== '__default__') {
132 checksum
.setDisabled(true);
133 checksum
.setValue("");
135 checksum
.setDisabled(false);
143 reference
: 'formPanel',
157 buttonText
: gettext('Select File'),
159 fieldLabel
: gettext('File'),
161 accept
: '{extensions}',
164 change
: 'fileChange',
171 fieldLabel
: gettext('File name'),
177 xtype
: 'displayfield',
179 fieldLabel
: gettext('File size'),
185 xtype
: 'displayfield',
187 fieldLabel
: gettext('MIME type'),
193 xtype
: 'pveHashAlgorithmSelector',
194 name
: 'checksum-algorithm',
195 fieldLabel
: gettext('Hash algorithm'),
198 value
: '__default__',
200 change
: 'hashChange',
206 fieldLabel
: gettext('Checksum'),
209 emptyText
: gettext('none'),
210 reference
: 'downloadUrlChecksum',
213 xtype
: 'progressbar',
216 reference
: 'progressBar',
219 xtype
: 'hiddenfield',
227 validitychange
: 'validitychange',
235 text
: gettext('Abort'),
236 reference
: 'abortBtn',
238 handler: function() {
240 me
.up('pveStorageUpload').close();
244 text
: gettext('Upload'),
245 reference
: 'submitBtn',
261 initComponent: function() {
265 throw "no node name specified";
268 throw "no storage ID specified";
270 if (!me
.acceptedExtensions
[me
.content
]) {
271 throw "content type not supported";