diff --git a/nbextension/openbis/main.js b/nbextension/openbis/main.js index 796eea6df4dfcb725956505dfab0c65a28153726..c6bf7738ac775ec85f9c41361a7cf9505f0af90b 100644 --- a/nbextension/openbis/main.js +++ b/nbextension/openbis/main.js @@ -6,33 +6,16 @@ define([ ], function(IPython, dialog, utils, $, mc) { var currentConnection = '' - var checkOpenBisConnection = function(env, url, verify_certificates, username, password){ - var payload = { - 'url' : url, - 'verify_certificates' : verify_certificates, - 'username': username, - 'password': password - } - var downloadUrl = env.notebook.base_url + 'openbis/conn' - var settings = { - url: downloadUrl, - processData: false, - type: 'POST', - dataType: 'json', - data: JSON.stringify(payload), - contentType: 'application/json', - success: function (data) { - alert(data.statusText) - }, - error: function (data) { - alert(data.statusText) - } - } - utils.ajax(settings) - } + var selectedPermId = null + var currentSampleIdentifier = null + var currentDownloadPath = null + + function show_available_connections (data, conn_table) { + if (!currentDownloadPath) { + currentDownloadPath = data.cwd + } - var show_available_connections = function(data, conn_table){ - var table = $('<table>').addClass('table-bordered').addClass('table-condensed'); + var table = $('<table>').addClass('table-bordered table-striped table-condensed') var thead = $('<thead>') var title_row = $('<tr>') .append($('<th>') @@ -44,11 +27,16 @@ define([ .append($('<th>') .text('URL') ) + .append($('<th>') + .text('Status') + ) title_row.appendTo(thead) thead.appendTo(table) data.connections.forEach( function(item, index, arr) { - var conn = $('<input type="radio" name="connection_name">').attr("value", item.name) + var conn = $('<input type="radio" name="connection_name">') + .attr("value", item.name) + .attr("url", item.url) conn.change( function() { currentConnection = item.name }) @@ -69,28 +57,85 @@ define([ .append($('<td>') .text(item.url) ) + .append($('<td>') + .text(item.status) + ) + + table.append(row) + }) + + conn_table.empty().append($('<strong>').text('Please choose a connection')).append(table) + } + + function show_datasets_table( data, datasets_table) { + var table = $('<table>').addClass('table-bordered table-striped table-condensed text-nowrap') + var thead = $('<thead>') + var title_row = $('<tr>') + .append($('<th>') + .text('permId') + ) + .append($('<th>') + .text('Type') + ) + .append($('<th>') + .text('Experiment') + ) + .append($('<th>') + .text('Registration Date') + ) + .append($('<th>') + .text('Status') + ) + .append($('<th>') + .text('Size') + ) + title_row.appendTo(thead) + thead.appendTo(table) + + data.dataSets.forEach( function(item, index, arr) { + var permId = $('<input type="radio" name="permId">').attr("value", item.permId) + permId.change(function() { + if ($(this).is(':checked')) { + selectedPermId = this.value + } + }) + + var row = $('<tr>') + .append( + $('<td>').append(permId).append(' ' + item.permId) + ) + .append($('<td>') + .text(item.type) + ) + .append($('<td>') + .text(item.experiment) + ) + .append($('<td>') + .text(item.registrationDate) + ) + .append($('<td>') + .text(item.status) + ) + .append($('<td>') + .text(item.size) + ) table.append(row) }) - conn_table.empty().append('<p><b>Please choose a connection</b></p>').append(table) + datasets_table.empty().append(table) + } - var getOpenBisConnections = function(env, conn_table) { + function getOpenBisConnections(env, conn_table) { var connectionsUrl = env.notebook.base_url + 'openbis/conn' var settings = { url: connectionsUrl, processData: false, type: 'GET', dataType: 'json', - contentType: 'application/json', - success: function (data) { - show_available_connections(data, conn_table) - }, - error: function (data) { - alert(data.status) - } + contentType: 'application/json' } - utils.ajax(settings) + return utils.ajax(settings) } var fetchDatasetFromOpenBis = { @@ -100,130 +145,178 @@ define([ handler: function (env) { var conn_table = $('<div id="openbis_connections"/>') getOpenBisConnections(env, conn_table) + .done(function (data) { + show_available_connections(data, conn_table) + }) + .fail(function (data) { + alert(data.status) + }) + .always(function () { + showDownloadDialog() + }) - var sample = $('<p>').append($('<b>').text('Sample identifier/permId: ')) - var sampleIdentifier = $('<input type="text" name="sampleIdentifier" size=40>') - var show_datasets_btn = $('<button type="button" class="btn-info btn-xs">show datasets</button>') - var datasets_table = $('<div id="dataset_table">') - show_datasets_btn.click( function() { - var connection = $('input[name="connection_name"]:checked').val() - var settings = { - url: env.notebook.base_url + 'openbis/sample/' + connection + '/' + encodeURIComponent(sampleIdentifier.val()), - processData: false, - type: 'GET', - dataType: 'json', - contentType: 'application/json', - } - utils.ajax(settings) - .done(function(data) { - alert('success') - console.log(data); - }) - .fail(function(data) { - alert('failed') - console.log(data); - }) - }) - sample.append(sampleIdentifier).append(show_datasets_btn).append(datasets_table) - - var dataset = $('<p>').append($('<b>').text('DataSet permId: ')) - var datasetPermId = $('<input type="text" name="datasetPermId" size=40>') - dataset.append(datasetPermId) - - var div = $('<div/>') - div.append(conn_table).append(sample).append(dataset) - - // get the canvas for user feedback - var container = $('#notebook-container') + function showDownloadDialog() { + // This function gets called after loading the openBIS connections + // to make sure we can display the download path provided by the server. + + // show DataSets for Sample identifier/permid + var sample = $("<div>") + sample.append($('<strong>').text('Sample identfier/permId: ')) + sample.css('margin-top', '10px') + var sampleIdentifier = $('<input type="text" name="sampleIdentifier" size=40 placeholder="sample identifier">') + .val(currentSampleIdentifier) + var show_datasets_btn = $('<button type="button" class="btn-info btn-xs">show datasets</button>') + var datasets_table = $('<div id="dataset_table">') + .addClass("output output_scroll") + .css('max-height', '10em') + show_datasets_btn.click(function () { + var connection_name = $('input[name="connection_name"]:checked').val() + currentConnection = connection_name + currentSampleIdentifier = sampleIdentifier.val() + if (!connection_name) { + alert('Please choose a connection') + return false + } + if (!currentSampleIdentifier) { + alert('Please specify a sample identifier/permId') + return false + } + var settings = { + url: env.notebook.base_url + 'openbis/sample/' + connection_name + '/' + encodeURIComponent(currentSampleIdentifier), + processData: false, + type: 'GET', + dataType: 'json', + contentType: 'application/json', + success: function(data) { + show_datasets_table(data, datasets_table) + }, + error: function(data) { + console.log(data); + + console.log(data.statusText); + alert('Error: ' + data.statusText) + } + } + utils.ajax(settings) - function downloadDataset () { - var notebook = IPython.notebook - var re = /\/notebooks(.*?)$/ - var connection = $('input[name="connection_name"]:checked').val() - var downloadUrl = env.notebook.base_url + 'openbis/dataset/' + connection + '/' + datasetPermId.val() + }) + sample.append(sampleIdentifier).append(show_datasets_btn).append(datasets_table) + + // dataSetPermId only + var dataset = $('<p>') + .css('margin-top', '10px') + .append($('<b>').text('... or enter DataSet permId directly: ')) + var datasetPermId = $('<input type="text" name="datasetPermId" size=40 placeholder="dataset permId">') + dataset.append(datasetPermId) + + // download path + var downloadPath =$('<input type="text" name="downloadPath" size=100>') + .val(currentDownloadPath) + var path = $('<div>') + .append($('<strong>').text('download data to path: ')) + .append(downloadPath) + + var download_dialog_box = $('<div/>') + download_dialog_box.append(conn_table).append(sample).append(dataset).append(path) + + function downloadDataset(permId, path) { + var notebook = IPython.notebook + var connection_name = $('input[name="connection_name"]:checked').val() + var connection_url = $('input[name="connection_name"]:checked').attr('url') + var downloadUrl = env.notebook.base_url + 'openbis/dataset/' + + connection_name + '/' + permId + '/' + encodeURIComponent(path) + + // get the canvas for user feedback + var container = $('#notebook-container') + + var settings = { + url: downloadUrl, + processData: false, + type: 'GET', + dataType: 'json', + contentType: 'application/json' + } - var settings = { - url: downloadUrl, - processData: false, - type: 'GET', - dataType: 'json', - contentType: 'application/json' + // download the dataset files + utils.ajax(settings) + .done(function (data) { + // display feedback to user + var feedback = '<div class="openbis-feedback alert alert-success alert-dismissible" role="alert">' + + '<button type="button" class="close" data-dismiss="alert" aria-label="Close">' + + '<span aria-hidden="true">×</span></button>' + + data.statusText + + '</div>' + + // display feedback + $('.openbis-feedback').remove() + container.prepend(feedback) + + // write statusText from returned data to notebooks metadata + if (typeof notebook.metadata.openbis_connections === 'undefined') { + notebook.metadata.openbis_connections = {} + } + if (typeof notebook.metadata.openbis_connections[connection_url] === 'undefined') { + notebook.metadata.openbis_connections[connection_url] = {} + } + // store metadata about the downloaded files into the notebook-metadata + if (data.permId) { + notebook.metadata.openbis_connections[connection_url][data.permId] = { + "permId": data.permId, + "path": data.path, + "dataStore": data.dataStore, + "location": data.location, + "size": data.size, + "status": data.statusText + } + } + currentDownloadPath = path + }) + .fail(function (data) { + // display feedback to user + var feedback = + '<div class="openbis-feedback alert alert-danger alert-dismissible" role="alert">' + + '<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>' + + '<strong>Error: </strong>Dataset was not downloaded.<div>' + data.statusText + '</div></div>' + + // display feedback + $('.openbis-feedback').remove() + container.prepend(feedback) + }) } - //console.log(IPython.notebook) - // display preloader during commit and push - var preloader = '<img class="openbis-feedback" src="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.5.8/ajax-loader.gif">' - container.prepend(preloader) - $('.openbis-feedback').remove() + function onDownloadClick() { + connection_name = $('input[name="connection_name"]:checked').val() + if (typeof connection_name === "undefined") { + alert('please choose a connection') + return false + } - // download the dataset files - utils.ajax(settings) - .done( function (data) { - console.log(data); - // display feedback to user - var container = $('#notebook-container') - var feedback = '<div class="openbis-feedback alert alert-success alert-dismissible" role="alert">' + - '<button type="button" class="close" data-dismiss="alert" aria-label="Close">' + - '<span aria-hidden="true">×</span></button>' + - data.statusText + - '</div>' + if (!selectedPermId) { + selectedPermId = datasetPermId.val() + } - // display feedback - $('.openbis-feedback').remove() - container.prepend(feedback) + if (!selectedPermId) { + alert('please select a dataset or provide a permId') + return false + } + downloadDataset(selectedPermId, downloadPath.val()) + } - // write statusText from returned data to notebooks metadata - if ( typeof notebook.metadata.openbis === 'undefined') { - notebook.metadata.openbis = {} - } - if ( typeof notebook.metadata.openbis.permIds === 'undefined' ) { - notebook.metadata.openbis.permIds = {} - } - if ( data.permId ) { - notebook.metadata.openbis.permIds[data.permId] = data.statusText + dialog.modal({ + body: download_dialog_box, + title: 'Download openBIS DataSet', + buttons: { + 'Cancel': {}, + 'Download': { + class: 'btn-primary btn-large', + click: onDownloadClick, } - }) - .fail( function (data) { - // display feedback to user - var feedback = - '<div class="openbis-feedback alert alert-danger alert-dismissible" role="alert">' + - '<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>' + - '<strong>Error: </strong>Dataset was not downloaded.<div>' + data.statusText + '</div></div>' - console.log(data); - - // display feedback - $('.openbis-feedback').remove() - container.prepend(feedback) - }) - } - - function onDownloadClick () { - connection_name = $('input[name="connection_name"]:checked').val() - if (typeof connection_name === "undefined") { - alert('please choose a connection') - return false - } - if (!datasetPermId.val()) { - alert('please provide a permId') - return false - } - downloadDataset() + }, + notebook: env.notebook, + keyboard_manager: env.notebook.keyboard_manager + }) } - - dialog.modal({ - body: div, - title: 'Download openBIS DataSet', - buttons: { - 'Cancel': {}, - 'Download': { - class: 'btn-primary btn-large', - click: onDownloadClick, - } - }, - notebook: env.notebook, - keyboard_manager: env.notebook.keyboard_manager - }) } } @@ -232,33 +325,66 @@ define([ icon: 'fa-cloud-upload', help_index: '', handler: function (env) { - var p = $('<p/>').text('Please enter a Sample or DataSet identifier/permId') - var input = $('<textarea rows="4" cols="72"></textarea>') - var div = $('<div/>') - var uploadUrl = env.notebook.base_url + 'openbis/dataset' + var conn_table = $('<div id="openbis_connections"/>') + getOpenBisConnections(env, conn_table) + .done(function (data) { + show_available_connections(data, conn_table) + }) + .fail(function (data) { + alert(data.status) + }) + var ds_name = $('<input type="text" name="ds_name" size=40 placeholder="name">') + var ds_description = $('<input type="text" name="ds_description" size=40 placeholder="description">') + var ds_type = $('<input type="text" name="ds_type" size=40 placeholder="type">') + var sampleIdentifier = $('<input type="text" name="sampleIdentifier" size=40 placeholder="sample identifier">') + .val(currentSampleIdentifier) + var ds_files = $('<input type="text" name="files" size=40 placeholder="filenames">') + - div.append(p).append(input) + var inputs = $('<div>') + .css('margin-top', '10px') + .append($('<p>').text('Name: ').append(ds_name)) + .append($('<p>').text('Description: ').append(ds_description)) + .append($('<p>').text('Type: ').append(ds_type)) + .append($('<p>').text('Sample: ').append(sampleIdentifier)) + .append($('<p>').text('Files: ').append(ds_files)) + + var uploadDialogBox = $('<div/>').append(conn_table).append(inputs) // get the canvas for user feedback var container = $('#notebook-container') function onOk () { + var connection_name = $('input[name="connection_name"]:checked').val() + var uploadUrl = env.notebook.base_url + 'openbis/dataset/' + connection_name + var notebook = IPython.notebook - var re = /\/notebooks(.*?)$/ + var re = /\/notebooks\/(.*?)$/ + var files = [] var filepath = window.location.pathname.match(re)[1] - //var payload = {'filename': filepath, 'msg': input.val()} + files.push(filepath) + if (ds_files.val()) { + files.push(ds_files.val()) + } + + var dataSetInfo = { + "name" : ds_name.val(), + "description" : ds_description.val(), + "type" : ds_type.val(), + "files" : files, + "sampleIdentifier": sampleIdentifier.val() + } + console.log(dataSetInfo); - payload = JSON.stringify(input.val()) var settings = { - url: commitUrl, + url: uploadUrl, processData: false, - type: 'PUT', + type: 'POST', dataType: 'json', - data: payload, + data: JSON.stringify(dataSetInfo), contentType: 'application/json', success: function (data) { // display feedback to user - var container = $('#notebook-container') var feedback = '<div class="openbis-feedback alert alert-success alert-dismissible" role="alert">' + '<button type="button" class="close" data-dismiss="alert" aria-label="Close">' + '<span aria-hidden="true">×</span></button>' + @@ -293,7 +419,6 @@ define([ container.prepend(feedback) } } - //console.log(IPython.notebook) // display preloader during commit and push var preloader = '<img class="openbis-feedback" src="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.5.8/ajax-loader.gif">' @@ -306,8 +431,8 @@ define([ if (IPython.notebook.dirty === true) { dialog.modal({ - body: 'Please, save the notebook before registering in openBIS.', - title: 'Action required', + body: 'Please save the notebook before uploading it to openBIS.', + title: 'Save notebook first', buttons: { 'Back': {} }, @@ -317,7 +442,7 @@ define([ } else { dialog.modal({ - body: div, + body: uploadDialogBox, title: 'Upload openBIS DataSet', buttons: { 'Cancel': {}, @@ -334,8 +459,6 @@ define([ } function _onLoad () { - // log to console - //console.info('Loaded Jupyter extension: openbis-jupyter-extension') // register new action var download_datasets = IPython.keyboard_manager.actions.register( fetchDatasetFromOpenBis, 'openbis-dataset-download', 'jupyter-openBIS') @@ -343,8 +466,6 @@ define([ var upload_datasets = IPython.keyboard_manager.actions.register( uploadDatasetsToOpenBis, 'openbis-dataset-upload', 'jupyter-openBIS') - console.info(download_datasets) - console.info(upload_datasets) // add button for new action IPython.toolbar.add_buttons_group([download_datasets, upload_datasets]) } diff --git a/openbis-connections.yaml-example b/openbis-connections.yaml-example new file mode 100644 index 0000000000000000000000000000000000000000..d8dfe123d941fe08f38a9d924b335ab678a30832 --- /dev/null +++ b/openbis-connections.yaml-example @@ -0,0 +1,11 @@ +connections: + - name : local test openBIS instance + url : localhost:8443 + verify_certificates : false + username : username + password : password + - name : productive openBIS instance + url : openbis.example.com + verify_certificates : true + username : username + password : password