Newer
Older
define([
"base/js/namespace",
"base/js/dialog",
"base/js/utils",
"jquery"
],
function(IPython, dialog, utils, $, mc) {
var currentConnection = ''
var currentSampleIdentifier = null
var currentDownloadPath = null
var ds_type = document.createElement("SELECT")
ds_type.className = "select-xs"
ds_type.id = "dataset_type"
function show_available_connections (data, conn_table) {
if (!currentDownloadPath) {
currentDownloadPath = data.cwd
}
var table = document.createElement("TABLE")
table.className = 'table-bordered table-striped table-condensed'
var thead = table.createTHead()
var thead_row = thead.insertRow(0)
var titles = ['', 'Name', 'URL', 'Status']
for (title of titles) {
thead_row.insertCell().textContent = title
}
//titles.forEach( function(item, index) {
// thead_row.insertCell().textContent = item
//})
data.connections.forEach( function(item, index, arr) {
//console.log(item)
var conn = document.createElement("INPUT")
conn.type = "radio"
conn.name = "connection_name"
conn.value = item.name
conn.setAttribute("url", item.url)
// Change the list of available dataset types
conn.onchange = function() {
//ds_type.children().remove()
while (ds_type.firstChild) {
ds_type.removeChild(ds_type.firstChild);
}
if (item.ds_types != null) {
for (ds_type in item.ds_types) {
option = document.createElement("OPTION")
option.textContent = ds_type.code
}
}
}
if (item.name === currentConnection) {
var row = tbody.insertRow()
row.insertCell().appendChild(conn)
row.insertCell().textContent = item.name
row.insertCell().textContent = item.url
row.insertCell().textContent = item.status
conn_table.innerHTML = ""
table_title = document.createElement("STRONG")
table_title.textContent = "Please choose a connection"
conn_table.appendChild(table_title)
conn_table.appendChild(table)
}
function show_datasets_table( data, datasets_table) {
table.className = "table-bordered table-striped table-condensed text-nowrap"
var thead = table.createTHead()
var t_row = thead.insertRow()
var titles = ['', 'permId', 'Type', 'Experiment', 'Registration Date', 'Status', 'Size']
titles.forEach( function(title) {
t_row.insertCell().textContent = title
})
var tbody = table.createTBody()
for (dataSet of data.dataSets) {
var permId = document.createElement("INPUT")
permId.type = "checkbox"
permId.value = dataSet.permId
var row = tbody.insertRow()
row.insertCell().appendChild(permId)
row.insertCell().textContent = dataSet.permId
row.insertCell().textContent = dataSet.type
row.insertCell().textContent = dataSet.experiment
row.insertCell().textContent = dataSet.registrationDate
row.insertCell().textContent = dataSet.status
row.insertCell().textContent = dataSet.size
}
while (datasets_table.firstChild) {
datasets_table.removeChild(datasets_table.firstChild);
}
datasets_table.appendChild(table)
var connectionsUrl = env.notebook.base_url + 'openbis/conn'
var settings = {
url: connectionsUrl,
processData: false,
type: 'GET',
dataType: 'json',
function createFeedback(type, content) {
var close = document.createElement("BUTTON")
close.className = "close"
close.setAttribute("data-dismiss", "alert")
close.setAttribute("aria-label", "Close")
var x = document.createElement("SPAN")
x.setAttribute("aria-hidden", true)
x.innerHTML = "×"
close.appendChild(x)
var feedbackBox = document.createElement( "DIV" )
feedbackBox.className = "openbis-feedback alert alert-dismissible alert-" + type
feedbackBox.setAttribute("role","alert")
feedbackBox.innerHTML = content
feedbackBox.prepend(close)
var nb_container = document.getElementById('notebook-container')
nb_container.prepend(feedbackBox)
}
var fetchDatasetFromOpenBis = {
help: 'Download a openBIS dataset to your local harddrive',
icon: 'fa-download',
help_index: '',
handler: function (env) {
//var conn_table = $('<div id="openbis_connections"/>')
var conn_table = document.createElement("DIV")
conn_table.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()
})
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 showDataSets = document.createElement("DIV")
var title = document.createElement("STRONG")
title.textContent = "Sample identfier/permId: "
showDataSets.appendChild(title)
showDataSets.style.marginTop = '10px'
var sampleIdentifier = document.createElement("INPUT")
sampleIdentifier.type = "text"
sampleIdentifier.name = "sampleIdentifier"
sampleIdentifier.size = 40
sampleIdentifier.placeholder = "sample identifier or permId"
sampleIdentifier.value = currentSampleIdentifier
var datasets_table = document.createElement("DIV")
datasets_table.id = "dataset_table"
datasets_table.className = "output output_scroll"
datasets_table.style.maxHeight = "10em"
var show_datasets_btn = document.createElement("BUTTON")
show_datasets_btn.className = "btn-info btn-xs"
show_datasets_btn.textContent = "show datasets"
show_datasets_btn.onclick = function() {
var selected_conn = document.querySelector('input[name=connection_name]:checked')
if (!selected_conn) {
alert('Please choose a connection')
return false
}
connection_name = selected_conn.value
currentConnection = connection_name
currentSampleIdentifier = sampleIdentifier.value
if (!currentSampleIdentifier) {
alert('Please specify a sample identifier/permId')
return false
}
var url = env.notebook.base_url + 'openbis/sample/' + connection_name + '/' + encodeURIComponent(currentSampleIdentifier)
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
fetch(url)
.then( function(response) {
if (response.ok) {
response.json()
.then( function(data) {
show_datasets_table(data, datasets_table)
})
}
else {
response.json()
.then( function(error) {
console.log(error.reason)
alert("Error: " + error.reason)
})
}
})
.catch( function(error) {
console.error('A serious network problem occured:', error)
})
//.then( function(response) {
// if (response.ok) {
// return response.json()
// }
// //throw new Error('Error fetching datasets.');
// response.text().then( function(errorMsg) {
// throw new Error(errorMsg);
// })
//})
//.then( function(data) {
// show_datasets_table(data, datasets_table)
//})
//.catch( function(error) {
// console.error(error)
// alert("Error: " + error.message )
//})
//var xhttp = new XMLHttpRequest()
//xhttp.onreadystatechange = function() {
// //var data = JSON.parse(this.responseText)
// //if (this.readyState == 4 && this.status == 200) {
// if (this.readyState === 4 && this.status >= 200 && this.status < 300) {
// var data = JSON.parse(this.response)
// show_datasets_table(data, datasets_table)
// }
// else if (this.readyState === 4 && this.status >= 400) {
// alert("Error:" + this.statusText)
// }
//};
//xhttp.open("GET", url, true);
//xhttp.send();
showDataSets.appendChild(sampleIdentifier)
showDataSets.appendChild(show_datasets_btn)
showDataSets.appendChild(datasets_table)
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
var dataset_direct = document.createElement("P")
dataset_direct.style.marginTop='10px'
dataset_direct.innerHTML = '<strong>enter DataSet permId directly: </strong>'
//var dataset = $('<p>')
// .css('margin-top', '10px')
// .append($('<b>').text('... or enter DataSet permId directly: '))
var datasetPermId = document.createElement("INPUT")
datasetPermId.type = "text"
datasetPermId.name = "datasetPermId"
datasetPermId.size = "40"
datasetPermId.placeholder = "dataSet permId"
dataset_direct.appendChild(datasetPermId)
var downloadPath = document.createElement("INPUT")
downloadPath.type = "text"
downloadPath.name = "downloadPath"
downloadPath.size = "90"
downloadPath.value = currentDownloadPath
var path = document.createElement("DIV")
path.innerHTML = "<strong>download data to path: </strong>"
path.appendChild(downloadPath)
var download_dialog_box = document.createElement("DIV")
download_dialog_box.appendChild(conn_table)
download_dialog_box.appendChild(showDataSets)
download_dialog_box.appendChild(dataset_direct)
download_dialog_box.appendChild(path)
function downloadDataset(selected_conn, selectedPermIds, downloadPath) {
var connection_name = selected_conn.value
var connection_url = selected_conn.getAttribute("url")
var nb_container = document.getElementById('notebook-container')
for (permId of selectedPermIds) {
var downloadUrl = env.notebook.base_url + 'openbis/dataset/'
+ connection_name + '/' + permId + '/' + encodeURIComponent(downloadPath)
var xhttp = new XMLHttpRequest()
xhttp.onreadystatechange = function() {
// feedback elements
var close = document.createElement("BUTTON")
close.className = "close"
close.setAttribute("data-dismiss", "alert")
close.setAttribute("aria-label", "Close")
var x = document.createElement("SPAN")
x.setAttribute("aria-hidden", true)
x.innerHTML = "×"
if (this.readyState === 4 && this.status >= 200 && this.status < 300) {
var data = JSON.parse(this.response)
createFeedback('success', data.statusText)
// successful download:
// 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 = downloadPath
else if (this.readyState === 4 && this.status >= 400) {
// download failed:
// display feedback to user
var feedback = "<strong>Error: </strong>Dataset was not downloaded.<div>"
+ this.statusText
+ "</div>"
createFeedback("danger", feedback)
//var feedbackBox = document.createElement( "DIV" )
//feedbackBox.className = "openbis-feedback alert alert-danger alert-dismissible"
//feedbackBox.setAttribute("role","alert")
//feedbackBox.prepend(close)
//nb_container.prepend(feedbackBox)
}
};
xhttp.open("GET", downloadUrl, true);
xhttp.send();
}
var selected_conn = document.querySelector('input[name=connection_name]:checked')
if (! selected_conn) {
alert('please choose a connection')
selectedPermIds = []
for (row of document.querySelectorAll('input[name=permId]:checked') ) {
selectedPermIds.push(row.value)
if (datasetPermId.value) {
selectedPermIds.push(datasetPermId.value)
}
if (!selectedPermIds) {
alert('please select a dataset or provide a permId')
return false
}
if (!downloadPath.value) {
alert('Please specify where you would like to download your files!')
return false
}
downloadDataset(selected_conn, selectedPermIds, downloadPath.value)
dialog.modal({
body: download_dialog_box,
title: 'Download openBIS DataSet',
buttons: {
'Cancel': {},
'Download': {
class: 'btn-primary btn-large',
click: onDownloadClick,
},
notebook: env.notebook,
keyboard_manager: env.notebook.keyboard_manager
})
}
}
}
var uploadDatasetsToOpenBis = {
help: 'upload Notebook and Data to openBIS',
icon: 'fa-cloud-upload',
help_index: '',
handler: function (env) {
var conn_table = document.createElement("DIV")
conn_table.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 ds_type = $('<select class="form-control select-xs" id="dataset_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">')
var inputs = $('<div>')
.css('margin-top', '10px')
.append($('<p>').text('Name: ').append(ds_name))
.append($('<p>').text('Description: ').append(ds_description))
.append($('<p>').text('DatasetType: ').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 selected_connection = document.querySelector('input[name=connection_name]:checked')
if (!selected_connection) {
alert("No connection selected")
return false
}
var connection_name = selected_connection.value
var uploadUrl = env.notebook.base_url + 'openbis/dataset/' + connection_name
var filepath = window.location.pathname.match(re)[1]
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()
}
contentType: 'application/json',
success: function (data) {
// display feedback to user
createFeedback('success', data.statusText)
// 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
}
},
error: function (data) {
// display feedback to user
var feedback = "<strong>Error: </strong>Dataset was not uploaded.<div>"
+ data.statusText
+ "</div>"
createFeedback('danger', feedback)
}
}
// 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()
// commit and push
utils.ajax(settings)
}
if (IPython.notebook.dirty === true) {
dialog.modal({
body: 'Please save the notebook before uploading it to openBIS.',
title: 'Save notebook first',
buttons: {
'Back': {}
},
notebook: env.notebook,
keyboard_manager: env.notebook.keyboard_manager
})
}
else {
dialog.modal({
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
title: 'Upload openBIS DataSet',
buttons: {
'Cancel': {},
'Upload': {
class: 'btn-primary btn-large',
click: onOk
}
},
notebook: env.notebook,
keyboard_manager: env.notebook.keyboard_manager
})
}
}
}
function _onLoad () {
// register new action
var download_datasets = IPython.keyboard_manager.actions.register(
fetchDatasetFromOpenBis, 'openbis-dataset-download', 'jupyter-openBIS')
var upload_datasets = IPython.keyboard_manager.actions.register(
uploadDatasetsToOpenBis, 'openbis-dataset-upload', 'jupyter-openBIS')
// add button for new action
IPython.toolbar.add_buttons_group([download_datasets, upload_datasets])
}
return {load_ipython_extension: _onLoad}
})