2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2025-05-22 03:32:04 +00:00

337 lines
12 KiB
JavaScript

/**
* Load the files page
*/
function loadFilesPage() {
var tabId = 'filesTab';
$('#' + tabId).empty();
// Set padding for page
$('#' + tabId).css('padding', '10px 30px');
// Create info bar
var info = $('#' + tabId).find('.ui-state-highlight');
// If there is no info bar
if (!info.length) {
var infoBar = createInfoBar('Below is a listing of the xCAT repository. ' +
'Upload any file or package into the repository using the Upload button. ' +
'Go into any subdirectories by specifying the directory path and clicking on Go.');
var directoryFS = $('<fieldset></fieldset>');
var dirLegend = $('<legend>Directory</legend>');
directoryFS.append(dirLegend);
// Division to hold directory actions
var actions = $('<div></div>');
directoryFS.append(actions);
// Create button to create a directory
var folderBtn = createButton('New folder');
folderBtn.click(function() {
var deleteFolderBtn = $('<span class="ui-icon ui-icon-close" style="margin-left:10px; margin-right:10px;"></span>');
var createFolderBtn = createButton('Create');
// Create a new directory
var newFolder = $('<li><span class="ui-icon ui-icon-folder-collapsed" style="margin-right: 10px;"></span><input type="text" name="new_folder"/></li>');
newFolder.prepend(deleteFolderBtn);
newFolder.append(createFolderBtn);
$('#repo_content ul').append(newFolder);
// Delete new folder on-click
deleteFolderBtn.click(function() {
$(this).parents('li').remove();
});
// Create folder on-click
createFolderBtn.click(function() {
var directory = $('#' + tabId + ' input[name="repo_directory"]');
var newFolderPath = $('#' + tabId + ' input[name="new_folder"]').val();
if (newFolderPath) {
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'webrun',
tgt : '',
args : 'createfolder;' + directory.val() + '/' + newFolderPath,
msg : ''
},
success:function(data) {
data = decodeRsp(data);
openDialog('info', data.rsp[0]);
}
});
$(this).parents('li').remove();
} else {
openDialog('warn', 'You must specify the folder name');
}
});
});
// Create button to upload files
var uploadBtn = createButton('Upload');
uploadBtn.click(function() {
var directory = $('#' + tabId + ' input[name="repo_directory"]');
openUploadDialog(directory.val());
});
// Create button to go into a directory path
var dirPath = $('<input type="text" name="repo_directory" style="width:400px;"/>');
var goBtn = createButton('Go');
goBtn.click(function() {
var directory = $('#' + tabId + ' input[name="repo_directory"]');
loadPath(directory.val());
});
goBtn.attr('id', 'go_to_path');
var space = $('<div id="repo_space"></div>');
var content = $('<div id="repo_content" class="form"></div>');
actions.append(folderBtn, uploadBtn, dirPath, goBtn);
directoryFS.append(space, content);
$('#' + tabId).append(infoBar, directoryFS);
}
// Retrieve repository space
getRepositorySpace();
// Retrieve files from /install
loadPath('/install');
}
/**
* Get the repository space
*/
function getRepositorySpace() {
// Grab repository space
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
async: false,
data : {
cmd : 'webrun',
tgt : '',
args : 'getrepospace',
msg : ''
},
success: function(data) {
data = decodeRsp(data);
$('#repo_space').children().remove();
// Data returned is: size, used, available, used %, mount
// Data could be in a different format in CMO, where it puts the directory on the line
// "rsp":["\/data\/xcat\/install 28G 6.0G 20G 24% \/install"],"msg":null}
var space = data.rsp[0].split(' ');
if (space.length == 6) {
space.splice(0,1);
}
var spaceLabel = $('<label style="margin:10px;width:300px;"><b>Total size: </b>' + space[0] +
'<b> | Available: </b>' + space[2] +
'</label>');
$('#repo_space').append(spaceLabel);
}
});
}
/**
* Open a dialog to upload files into the repository
*
* @param destDirectory The destination directory
*/
function openUploadDialog(destDirectory) {
// Create info bar
var info = createInfoBar('Select a file to upload onto ' + destDirectory + '.');
var dialog = $('<div id="upload_file_dg"></div>');
dialog.append(info);
// Upload file
var upload = $('<form id="upload_file" enctype="multipart/form-data"></form>');
var label = $('<label style="margin-right: 10px;">Remote file:</label>');
var file = $('<input type="file" name="file" id="file"/>');
var subBtn = createButton('Upload');
upload.append(label, file, subBtn);
dialog.append(upload);
upload.submit(function() {
// Create status bar, hide on load
var statBarId = 'uploadStatusBar';
var statBar = createStatusBar(statBarId);
var loader = createLoader('');
statBar.find('div').append('Do not close this dialog while the file is being uploaded ');
statBar.find('div').append(loader);
statBar.prependTo($('#upload_file_dg'));
var data = new FormData($('#upload_file')[0]);
$.ajax({
type: 'POST',
url : 'lib/uploadfile.php?destination=' + destDirectory,
data: data,
success: function(data) {
$('#uploadStatusBar').find('img').hide();
$('#uploadStatusBar').find('div').empty();
$('#uploadStatusBar').find('div').append(data);
// Refresh directory contents
$('#go_to_path').click();
getRepositorySpace();
},
cache: false,
contentType: false,
processData: false
});
return false;
});
// Create dialog
dialog.dialog({
modal: true,
title: 'Upload',
width: 500,
close: function() {$(this).remove();}
});
}
/**
* Load the directory path structure
*
* @path The directory path
*/
function loadPath(path) {
// Limit access to only /install
if (path.substring(0, 9).indexOf("install") == -1) {
openDialog('warn', 'You are not authorized to browse outside the repository');
return;
}
var tabId = 'filesTab';
var directory = $('#' + tabId + ' input[name="repo_directory"]');
directory.val(path);
// Un-ordered list containing directories and files
var contentId = 'repo_content';
$('#' + contentId).empty();
var itemsList = $('<ul></ul>');
$('#' + contentId).append(itemsList);
// Back button to go up a directory
var item = $('<li><span class="ui-icon ui-icon-folder-collapsed" style="margin-right: 10px;"></span>..</li>');
itemsList.append(item);
item.dblclick(function() {
if (path.lastIndexOf('/') > 1)
path = path.substring(0, path.lastIndexOf('/'));
loadPath(path);
});
$.ajax({
type: 'POST',
url : 'lib/getpath.php',
dataType : 'json',
data: {
action: 'browse',
path: path,
time: new Date().getTime()
},
beforeSend: function() {
// Show loading image
},
success: function(files) {
$.each(files, function(index, file) {
if (!file.path || file.path.indexOf("undefined"))
file.path = "";
var fullPath = file.path + "/" + file.name;
// Create a list showing the directories and files
var item;
if (file.isFolder) {
var deleteFolderBtn = $('<span class="ui-icon ui-icon-close" style="margin-left:10px; margin-right:10px;"></span>');
item = $('<li><span class="ui-icon ui-icon-folder-collapsed" style="margin-right: 10px;"></span>' + file.name + '</li>');
item.prepend(deleteFolderBtn);
itemsList.append(item);
item.dblclick(function() {
loadPath(directory.val() + fullPath);
});
// Delete file on click
deleteFolderBtn.click(function() {
deleteFile($(this).parents('li'), directory.val() + fullPath);
});
} else {
var icon = $('<span class="ui-icon ui-icon-document" style="margin-right: 10px;"></span>');
var deleteFileBtn = $('<span class="ui-icon ui-icon-close" style="margin-left:10px; margin-right:10px;"></span>');
item = $('<li><a href="' + directory.val() + fullPath + '">' + file.name + '</a></li>');
item.append(deleteFileBtn, icon);
// Delete file on click
deleteFileBtn.click(function() {
deleteFile($(this).parents('li'), directory.val() + fullPath);
});
itemsList.append(item);
}
});
}
});
}
/**
* Prompt user to confirm deletion of file
*
* @param container The element container
* @param file The file name to delete
*/
function deleteFile(container, file) {
// Open dialog to confirm
var confirmDialog = $('<div id="confirm_delete"></div>');
var warn = createWarnBar('Are you sure you want to delete ' + file + '?');
confirmDialog.append(warn);
confirmDialog.dialog({
title: "Confirm",
modal: true,
width: 400,
close: function() {$(this).remove();},
buttons: {
"Ok": function() {
var loader = createLoader('').css({'margin': '5px'});
$(this).append(loader);
// Change dialog buttons
$(this).dialog('option', 'buttons', {
'Close':function() {
$(this).dialog('destroy').remove();
}
});
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
async: false,
data : {
cmd : 'webrun',
tgt : '',
args : 'deletefile;' + file,
msg : ''
},
success: function(data) {
data = decodeRsp(data);
$('#confirm_delete').children().remove();
var info = createInfoBar(data.rsp[0]);
$('#confirm_delete').append(info);
getRepositorySpace();
}
});
// Delete folder from the list
container.remove();
},
"Cancel": function() {
$(this).dialog('destroy').remove();
}
}
});
}