]>
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 var win
= Ext
.create('PVE.window.TaskViewer', {
138 buttons
: [ submitBtn
]
145 Ext
.define('PVE.storage.Upload', {
146 extend
: 'Ext.window.Window',
147 alias
: 'widget.pveStorageUpload',
153 initComponent : function() {
154 /*jslint confusion: true */
160 throw "no node name specified";
164 throw "no storage ID specified";
167 var baseurl
= "/nodes/" + me
.nodename
+ "/storage/" + me
.storage
+ "/upload";
169 var pbar
= Ext
.create('Ext.ProgressBar', {
174 me
.formPanel
= Ext
.create('Ext.form.Panel', {
186 xtype
: 'pveContentTypeSelector',
188 fieldLabel
: gettext('Content'),
190 value
: me
.contents
[0] || '',
196 buttonText
: gettext('Select File...'),
203 var form
= me
.formPanel
.getForm();
205 var doStandardSubmit = function() {
207 url
: "/api2/htmljs" + baseurl
,
208 waitMsg
: gettext('Uploading file...'),
209 success: function(f
, action
) {
212 failure: function(f
, action
) {
213 var msg
= PVE
.Utils
.extractFormActionError(action
);
214 Ext
.Msg
.alert(gettext('Error'), msg
);
219 var updateProgress = function(per
, bytes
) {
220 var text
= (per
* 100).toFixed(2) + '%';
222 text
+= " (" + PVE
.Utils
.format_size(bytes
) + ')';
224 pbar
.updateProgress(per
, text
);
227 var abortBtn
= Ext
.create('Ext.Button', {
228 text
: gettext('Abort'),
230 handler: function() {
235 var submitBtn
= Ext
.create('Ext.Button', {
236 text
: gettext('Upload'),
238 handler: function(button
) {
247 button
.setDisabled(true);
248 abortBtn
.setDisabled(false);
250 var field
= form
.findField('content');
251 fd
.append("content", field
.getValue());
252 field
.setDisabled(true);
254 field
= form
.findField('filename');
255 var file
= field
.fileInputEl
.dom
;
256 fd
.append("filename", file
.files
[0]);
257 field
.setDisabled(true);
259 pbar
.setVisible(true);
262 xhr
= new XMLHttpRequest();
264 xhr
.addEventListener("load", function(e
) {
265 if (xhr
.status
== 200) {
268 var msg
= gettext('Error') + " " + xhr
.status
.toString() + ": " + Ext
.htmlEncode(xhr
.statusText
);
269 var result
= Ext
.decode(xhr
.responseText
);
270 result
.message
= msg
;
271 var htmlStatus
= PVE
.Utils
.extractRequestError(result
, true);
272 Ext
.Msg
.alert(gettext('Error'), htmlStatus
, function(btn
) {
279 xhr
.addEventListener("error", function(e
) {
280 var msg
= "Error " + e
.target
.status
.toString() + " occurred while receiving the document.";
281 Ext
.Msg
.alert(gettext('Error'), msg
, function(btn
) {
286 xhr
.upload
.addEventListener("progress", function(evt
) {
287 if (evt
.lengthComputable
) {
288 var percentComplete
= evt
.loaded
/ evt
.total
;
289 updateProgress(percentComplete
, evt
.loaded
);
293 xhr
.open("POST", "/api2/json" + baseurl
, true);
298 form
.on('validitychange', function(f
, valid
) {
299 submitBtn
.setDisabled(!valid
);
303 title
: gettext('Upload'),
305 buttons
: [ abortBtn
, submitBtn
],
319 Ext
.define('PVE.storage.ContentView', {
320 extend
: 'Ext.grid.GridPanel',
322 alias
: 'widget.pveStorageContentView',
329 initComponent : function() {
332 var nodename
= me
.pveSelNode
.data
.node
;
334 throw "no node name specified";
337 var storage
= me
.pveSelNode
.data
.storage
;
339 throw "no storage ID specified";
342 var baseurl
= "/nodes/" + nodename
+ "/storage/" + storage
+ "/content";
343 var store
= Ext
.create('Ext.data.Store',{
344 model
: 'pve-storage-content',
345 groupField
: 'content',
348 url
: '/api2/json' + baseurl
356 var sm
= Ext
.create('Ext.selection.RowModel', {});
358 var groupingFeature
= Ext
.create('Ext.grid.feature.Grouping',{
359 groupHeaderTpl
: '{[ PVE.Utils.format_content_types(values.name) ]} ({rows.length} Item{[values.rows.length > 1 ? "s" : ""]})'
362 var reload = function() {
364 me
.statusStore
.load();
367 PVE
.Utils
.monStoreErrors(me
, store
);
369 var templateButton
= Ext
.create('PVE.button.Button',{
371 text
: gettext('Templates'),
372 handler: function() {
373 var win
= Ext
.create('PVE.storage.TemplateDownload', {
378 win
.on('destroy', reload
);
382 var uploadButton
= Ext
.create('PVE.button.Button', {
383 contents
: ['iso','vztmpl'],
384 text
: gettext('Upload'),
385 handler: function() {
387 var win
= Ext
.create('PVE.storage.Upload', {
390 contents
: me
.contents
393 win
.on('destroy', reload
);
397 me
.statusStore
= Ext
.create('PVE.data.ObjectStore', {
398 url
: '/api2/json/nodes/' + nodename
+ '/storage/' + storage
+ '/status'
404 features
: [ groupingFeature
],
408 text
: gettext('Restore'),
411 enableFn: function(rec
) {
412 return rec
&& rec
.data
.content
=== 'backup';
414 handler: function(b
, e
, rec
) {
416 if (rec
.data
.volid
.match(/vzdump-qemu-/)) {
418 } else if (rec
.data
.volid
.match(/vzdump-openvz-/) || rec
.data
.volid
.match(/vzdump-lxc-/)) {
424 var win
= Ext
.create('PVE.window.Restore', {
426 volid
: rec
.data
.volid
,
427 volidText
: PVE
.Utils
.render_storage_content(rec
.data
.volid
, {}, rec
),
431 win
.on('destroy', reload
);
436 text
: gettext('Remove'),
439 confirmMsg: function(rec
) {
440 return Ext
.String
.format(gettext('Are you sure you want to remove entry {0}'),
441 "'" + rec
.data
.volid
+ "'");
443 enableFn: function(rec
) {
444 return rec
&& rec
.data
.content
!== 'images';
446 handler: function(b
, e
, rec
) {
447 PVE
.Utils
.API2Request({
448 url
: baseurl
+ '/' + rec
.data
.volid
,
451 callback: function() {
454 failure: function (response
, opts
) {
455 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
463 gettext('Search') + ':', ' ',
467 enableKeyEvents
: true,
470 keyup: function(field
) {
471 store
.clearFilter(true);
475 value
: field
.getValue(),
486 header
: gettext('Name'),
489 renderer
: PVE
.Utils
.render_storage_content
,
493 header
: gettext('Format'),
498 header
: gettext('Size'),
500 renderer
: PVE
.Utils
.format_size
,
511 // disable the buttons/restrict the upload window
512 // if templates or uploads are not allowed
513 me
.mon(me
.statusStore
, 'load', function(s
,records
,succes
) {
514 var availcontent
= [];
515 Ext
.Array
.each(records
, function(item
){
516 if (item
.id
=== 'content') {
517 availcontent
= item
.data
.value
.split(',');
524 Ext
.Array
.each(availcontent
, function(content
) {
525 if (content
=== 'vztmpl') {
528 } else if (content
=== 'iso') {
534 if (templ
!== upload
) {
535 uploadButton
.contents
= cts
;
538 templateButton
.setDisabled(!templ
);
539 uploadButton
.setDisabled(!upload
&& !templ
);
544 Ext
.define('pve-storage-content', {
545 extend
: 'Ext.data.Model',
547 'volid', 'content', 'format', 'size', 'used', 'vmid',
548 'channel', 'id', 'lun',
551 convert: function(value
, record
) {
552 // check for volid, because if you click on a grouping header,
553 // it calls convert (but with an empty volid)
554 if (value
|| record
.data
.volid
=== null) {
557 return PVE
.Utils
.render_storage_content(value
, {}, record
);