]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/storage/ContentView.js
1 Ext
.define('PVE.grid.TemplateSelector', {
2 extend
: 'Ext.grid.GridPanel',
4 alias
: 'widget.pveTemplateSelector',
10 initComponent : function() {
14 throw "no node name specified";
17 var baseurl
= "/nodes/" + me
.nodename
+ "/aplinfo";
18 var store
= new Ext
.data
.Store({
20 groupField
: 'section',
23 url
: '/api2/json' + baseurl
27 var sm
= Ext
.create('Ext.selection.RowModel', {});
29 var groupingFeature
= Ext
.create('Ext.grid.feature.Grouping',{
30 groupHeaderTpl
: '{[ "Section: " + values.name ]} ({rows.length} Item{[values.rows.length > 1 ? "s" : ""]})'
33 var reload = function() {
37 PVE
.Utils
.monStoreErrors(me
, store
);
42 features
: [ groupingFeature
],
45 header
: gettext('Type'),
50 header
: gettext('Package'),
55 header
: gettext('Version'),
60 header
: gettext('Description'),
62 renderer
: Ext
.String
.htmlEncode
,
76 Ext
.define('pve-aplinfo', {
77 extend
: 'Ext.data.Model',
79 'template', 'type', 'package', 'version', 'headline', 'infopage',
80 'description', 'os', 'section'
82 idProperty
: 'template'
87 Ext
.define('PVE.storage.TemplateDownload', {
88 extend
: 'Ext.window.Window',
89 alias
: 'widget.pveTemplateDownload',
92 title
: gettext('Templates'),
96 initComponent : function() {
97 /*jslint confusion: true */
100 var grid
= Ext
.create('PVE.grid.TemplateSelector', {
103 nodename
: me
.nodename
106 var sm
= grid
.getSelectionModel();
108 var submitBtn
= Ext
.create('PVE.button.Button', {
109 text
: gettext('Download'),
112 handler: function(button
, event
, rec
) {
113 PVE
.Utils
.API2Request({
114 url
: '/nodes/' + me
.nodename
+ '/aplinfo',
117 template
: rec
.data
.template
120 failure: function (response
, opts
) {
121 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
123 success: function(response
, options
) {
124 var upid
= response
.result
.data
;
126 Ext
.create('PVE.window.TaskViewer', {
129 destroy
: me
.reloadGrid
141 buttons
: [ submitBtn
]
148 Ext
.define('PVE.storage.Upload', {
149 extend
: 'Ext.window.Window',
150 alias
: 'widget.pveStorageUpload',
156 initComponent : function() {
157 /*jslint confusion: true */
163 throw "no node name specified";
167 throw "no storage ID specified";
170 var baseurl
= "/nodes/" + me
.nodename
+ "/storage/" + me
.storage
+ "/upload";
172 var pbar
= Ext
.create('Ext.ProgressBar', {
177 me
.formPanel
= Ext
.create('Ext.form.Panel', {
189 xtype
: 'pveContentTypeSelector',
191 fieldLabel
: gettext('Content'),
193 value
: me
.contents
[0] || '',
199 buttonText
: gettext('Select File...'),
206 var form
= me
.formPanel
.getForm();
208 var doStandardSubmit = function() {
210 url
: "/api2/htmljs" + baseurl
,
211 waitMsg
: gettext('Uploading file...'),
212 success: function(f
, action
) {
215 failure: function(f
, action
) {
216 var msg
= PVE
.Utils
.extractFormActionError(action
);
217 Ext
.Msg
.alert(gettext('Error'), msg
);
222 var updateProgress = function(per
, bytes
) {
223 var text
= (per
* 100).toFixed(2) + '%';
225 text
+= " (" + PVE
.Utils
.format_size(bytes
) + ')';
227 pbar
.updateProgress(per
, text
);
230 var abortBtn
= Ext
.create('Ext.Button', {
231 text
: gettext('Abort'),
233 handler: function() {
238 var submitBtn
= Ext
.create('Ext.Button', {
239 text
: gettext('Upload'),
241 handler: function(button
) {
250 button
.setDisabled(true);
251 abortBtn
.setDisabled(false);
253 var field
= form
.findField('content');
254 fd
.append("content", field
.getValue());
255 field
.setDisabled(true);
257 field
= form
.findField('filename');
258 var file
= field
.fileInputEl
.dom
;
259 fd
.append("filename", file
.files
[0]);
260 field
.setDisabled(true);
262 pbar
.setVisible(true);
265 xhr
= new XMLHttpRequest();
267 xhr
.addEventListener("load", function(e
) {
268 if (xhr
.status
== 200) {
271 var msg
= gettext('Error') + " " + xhr
.status
.toString() + ": " + Ext
.htmlEncode(xhr
.statusText
);
272 var result
= Ext
.decode(xhr
.responseText
);
273 result
.message
= msg
;
274 var htmlStatus
= PVE
.Utils
.extractRequestError(result
, true);
275 Ext
.Msg
.alert(gettext('Error'), htmlStatus
, function(btn
) {
282 xhr
.addEventListener("error", function(e
) {
283 var msg
= "Error " + e
.target
.status
.toString() + " occurred while receiving the document.";
284 Ext
.Msg
.alert(gettext('Error'), msg
, function(btn
) {
289 xhr
.upload
.addEventListener("progress", function(evt
) {
290 if (evt
.lengthComputable
) {
291 var percentComplete
= evt
.loaded
/ evt
.total
;
292 updateProgress(percentComplete
, evt
.loaded
);
296 xhr
.open("POST", "/api2/json" + baseurl
, true);
301 form
.on('validitychange', function(f
, valid
) {
302 submitBtn
.setDisabled(!valid
);
306 title
: gettext('Upload'),
308 buttons
: [ abortBtn
, submitBtn
],
322 Ext
.define('PVE.storage.ContentView', {
323 extend
: 'Ext.grid.GridPanel',
325 alias
: 'widget.pveStorageContentView',
332 initComponent : function() {
335 var nodename
= me
.pveSelNode
.data
.node
;
337 throw "no node name specified";
340 var storage
= me
.pveSelNode
.data
.storage
;
342 throw "no storage ID specified";
345 var baseurl
= "/nodes/" + nodename
+ "/storage/" + storage
+ "/content";
346 var store
= Ext
.create('Ext.data.Store',{
347 model
: 'pve-storage-content',
348 groupField
: 'content',
351 url
: '/api2/json' + baseurl
359 var sm
= Ext
.create('Ext.selection.RowModel', {});
361 var groupingFeature
= Ext
.create('Ext.grid.feature.Grouping',{
362 groupHeaderTpl
: '{[ PVE.Utils.format_content_types(values.name) ]} ({rows.length} Item{[values.rows.length > 1 ? "s" : ""]})'
365 var reload = function() {
367 me
.statusStore
.load();
370 PVE
.Utils
.monStoreErrors(me
, store
);
372 var templateButton
= Ext
.create('PVE.button.Button',{
374 text
: gettext('Templates'),
375 handler: function() {
376 var win
= Ext
.create('PVE.storage.TemplateDownload', {
385 var uploadButton
= Ext
.create('PVE.button.Button', {
386 contents
: ['iso','vztmpl'],
387 text
: gettext('Upload'),
388 handler: function() {
390 var win
= Ext
.create('PVE.storage.Upload', {
393 contents
: me
.contents
396 win
.on('destroy', reload
);
400 me
.statusStore
= Ext
.create('PVE.data.ObjectStore', {
401 url
: '/api2/json/nodes/' + nodename
+ '/storage/' + storage
+ '/status'
407 features
: [ groupingFeature
],
411 text
: gettext('Restore'),
414 enableFn: function(rec
) {
415 return rec
&& rec
.data
.content
=== 'backup';
417 handler: function(b
, e
, rec
) {
419 if (rec
.data
.volid
.match(/vzdump-qemu-/)) {
421 } else if (rec
.data
.volid
.match(/vzdump-openvz-/) || rec
.data
.volid
.match(/vzdump-lxc-/)) {
427 var win
= Ext
.create('PVE.window.Restore', {
429 volid
: rec
.data
.volid
,
430 volidText
: PVE
.Utils
.render_storage_content(rec
.data
.volid
, {}, rec
),
434 win
.on('destroy', reload
);
439 text
: gettext('Remove'),
442 confirmMsg: function(rec
) {
443 return Ext
.String
.format(gettext('Are you sure you want to remove entry {0}'),
444 "'" + rec
.data
.volid
+ "'");
446 enableFn: function(rec
) {
447 return rec
&& rec
.data
.content
!== 'images';
449 handler: function(b
, e
, rec
) {
450 PVE
.Utils
.API2Request({
451 url
: baseurl
+ '/' + rec
.data
.volid
,
454 callback: function() {
457 failure: function (response
, opts
) {
458 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
467 text
: gettext('Show Configuration'),
470 enableFn: function(rec
) {
471 return rec
&& rec
.data
.content
=== 'backup';
473 handler: function(b
,e
,rec
) {
474 var win
= Ext
.create('PVE.window.BackupConfig', {
475 volume
: rec
.data
.volid
,
476 pveSelNode
: me
.pveSelNode
483 gettext('Search') + ':', ' ',
487 enableKeyEvents
: true,
490 keyup: function(field
) {
491 store
.clearFilter(true);
495 value
: field
.getValue(),
506 header
: gettext('Name'),
509 renderer
: PVE
.Utils
.render_storage_content
,
513 header
: gettext('Format'),
518 header
: gettext('Size'),
520 renderer
: PVE
.Utils
.format_size
,
531 // disable the buttons/restrict the upload window
532 // if templates or uploads are not allowed
533 me
.mon(me
.statusStore
, 'load', function(s
,records
,succes
) {
534 var availcontent
= [];
535 Ext
.Array
.each(records
, function(item
){
536 if (item
.id
=== 'content') {
537 availcontent
= item
.data
.value
.split(',');
544 Ext
.Array
.each(availcontent
, function(content
) {
545 if (content
=== 'vztmpl') {
548 } else if (content
=== 'iso') {
554 if (templ
!== upload
) {
555 uploadButton
.contents
= cts
;
558 templateButton
.setDisabled(!templ
);
559 uploadButton
.setDisabled(!upload
&& !templ
);
564 Ext
.define('pve-storage-content', {
565 extend
: 'Ext.data.Model',
567 'volid', 'content', 'format', 'size', 'used', 'vmid',
568 'channel', 'id', 'lun',
571 convert: function(value
, record
) {
572 // check for volid, because if you click on a grouping header,
573 // it calls convert (but with an empty volid)
574 if (value
|| record
.data
.volid
=== null) {
577 return PVE
.Utils
.render_storage_content(value
, {}, record
);