Skip to content
Snippets Groups Projects
dialog.js 27.3 KiB
Newer Older
  • Learn to ignore specific revisions
  • define([
            "base/js/namespace",
            "base/js/dialog",
            "base/js/utils",
            "jquery"
        ],
        function(IPython, dialog, utils, $, mc) {
            var currentConnection = ''
    
    Swen Vermeul's avatar
    Swen Vermeul committed
            var selectedPermId = null
            var currentSampleIdentifier = null
            var currentDownloadPath = null
    
            var ds_type = document.createElement("SELECT")
            ds_type.className = "select-xs"
            ds_type.id = "dataset_type"
    
    Swen Vermeul's avatar
    Swen Vermeul committed
    
            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']
                titles.forEach( function(item, index) {
                    thead_row.insertCell().textContent = item
                })
    
                tbody = table.createTBody()
    
                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() {
    
                        currentConnection = item.name
    
                        //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) {
    
                        conn.checked = true
    
                        conn.checked = false
    
    
                    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)
    
    Swen Vermeul's avatar
    Swen Vermeul committed
            }
    
            function show_datasets_table( data, datasets_table) {
    
                var table = document.createElement("TABLE")
                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 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)
    
    Swen Vermeul's avatar
    Swen Vermeul committed
    
                data.dataSets.forEach( function(item, index, arr) {
    
                    var permId = document.createElement("INPUT")
                    permId.type = "radio"
                    permId.name = "permId"
                    permId.value = item.permId
    
                    //var permId = $('<input type="radio" name="permId">').attr("value", item.permId)
                    permId.onchange = function() {
                        if (this.checked) {
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                            selectedPermId = this.value
                        }
    
                    }
                    //permId.change(function() {
                    //    if ($(this).is(':checked')) {
                    //        selectedPermId = this.value
                    //    }
                    //})
    
                    var tbody = table.createTBody()
                    var row = tbody.insertRow()
                    row.insertCell().appendChild(permId)
                    row.insertCell().textContent = item.type
                    row.insertCell().textContent = item.experiment
                    row.insertCell().textContent = item.registrationDate
                    row.insertCell().textContent = item.status
                    row.insertCell().textContent = item.size
    
                    //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)
    
                while (datasets_table.firstChild) {
                    datasets_table.removeChild(datasets_table.firstChild);
                }
                datasets_table.appendChild(table)
    
                //datasets_table.innerHTML = ''
                //datasets_table.innerHTML = table
                //datasets_table.empty().append(table)
    
    Swen Vermeul's avatar
    Swen Vermeul committed
            function getOpenBisConnections(env, conn_table) {
    
                 var connectionsUrl = env.notebook.base_url + 'openbis/conn'
                 var settings = {
                     url: connectionsUrl,
                     processData: false,
                     type: 'GET',
                     dataType: 'json',
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                     contentType: 'application/json'
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                 return utils.ajax(settings)
    
            }
    
            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)
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                        .done(function (data) {
                            show_available_connections(data, conn_table)
                        })
                        .fail(function (data) {
                            alert(data.status)
                        })
                        .always(function () {
                            showDownloadDialog()
                        })
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                    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 = document.createElement("DIV")
                        var title = document.createElement("STRONG")
                        title.textContent = "Sample identfier/permId: "
                        sample.appendChild(title)
                        sample.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) {
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                                alert('Please choose a connection')
                                return false
                            }
    
                            connection_name = selected_conn.value
    
                            currentConnection = connection_name
                            currentSampleIdentifier = sampleIdentifier.value
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                            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'
                            //}
                            var url = env.notebook.base_url + 'openbis/sample/' + connection_name + '/' + encodeURIComponent(currentSampleIdentifier)
    
                            var xhttp = new XMLHttpRequest()
                            xhttp.onreadystatechange = function() {
                                var data = JSON.parse(this.responseText)
                                //if (this.readyState == 4 && this.status == 200) {
                                if (this.status == 200) {
    
                                    show_datasets_table(data, datasets_table)
    
                                }
                                else {
                                    alert("Error:" + data.statusText)
                                }
                            };
                            xhttp.open("GET", url, true);
                            xhttp.send();
    
                            //utils.ajax(settings)
                            //    .done(function(data) {
                            //        show_datasets_table(data, datasets_table)
                            //    })
                            //    .fail(function(data) {
                            //        alert('Error:' + data.statusText)
                            //    })
                        }
                        sample.appendChild(sampleIdentifier)
                        sample.appendChild(show_datasets_btn)
                        //sample.appendChild(datasets_table)
    
    Swen Vermeul's avatar
    Swen Vermeul committed
    
                        // dataSetPermId only
    
                        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(dataset_direct)
                        download_dialog_box.appendChild(path)
    
                        function downloadDataset(selected_conn, permId, path) {
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                            var notebook = IPython.notebook
    
                            var connection_name = selected_conn.value()
                            var connection_url  = selected_conn.getAttribute("url")
                            //var connection_name = $('input[name="connection_name"]:checked').val()
                            //var connection_url = $('input[name="connection_name"]:checked').attr('url')
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                            var downloadUrl = env.notebook.base_url + 'openbis/dataset/'
                                + connection_name + '/' + permId + '/' + encodeURIComponent(path)
    
                            // get the canvas for user feedback
    
                            //var container = $('#notebook-container')
                            var container = document.getElementById('notebook-container')
    
    Swen Vermeul's avatar
    Swen Vermeul committed
    
                            var settings = {
                                url: downloadUrl,
                                processData: false,
                                type: 'GET',
                                dataType: 'json',
                                contentType: 'application/json'
                            }
    
                            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.textContent = "&times;"
    
                            // remove existing feedbacks
                            for (element in document.getElementsByClassName("openbis-feedback")) {
                                element.remove()
                            }
    
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                            // download the dataset files
                            utils.ajax(settings)
                                .done(function (data) {
                                    // display feedback to user
    
                                    var feedback = document.createElement( "DIV" )
                                    feedback.className = "openbis-feedback alert alert-success alert-dismissible"
                                    feedback.setAttribute("role","alert")
                                    feedback.append(data.statusText)
    
                                    close.appendChild(x)
                                    feedback.appendChild(close)
    
    
                                    //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">&times;</span></button>' +
                                    //    data.statusText +
                                    //    '</div>'
    
    Swen Vermeul's avatar
    Swen Vermeul committed
    
                                    // display feedback
    
                                    //$('.openbis-feedback').remove()
    
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                                    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 = document.createElement( "DIV" )
                                    feedback.className = "openbis-feedback alert alert-danger alert-dismissible"
                                    feedback.setAttribute("role","alert")
                                    feedback.innerHTML = "<strong>Error: </strong>Dataset was not downloaded.<div>"
                                                       + data.statusText
                                                       + "</div>"
    
                                    //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">&times;</span></button>' +
                                    //    '<strong>Error: </strong>Dataset was not downloaded.<div>' + data.statusText + '</div></div>'
    
                                    close.appendChild(x)
                                    feedback.appendChild(close)
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                                    container.prepend(feedback)
                                })
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                        function onDownloadClick() {
    
                            var selected_conn = document.querySelector('input[name=connection_name]:checked')
                            //connection_name = $('input[name="connection_name"]:checked').val()
                            if (! selected_conn) {
                                alert('Please choose a connection')
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                                return false
                            }
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                            if (!selectedPermId) {
                                selectedPermId = datasetPermId.val()
                            }
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                            if (!selectedPermId) {
                                alert('please select a dataset or provide a permId')
                                return false
                            }
    
    
                            if (!downloadPath.value)
                            downloadDataset(selected_conn, selectedPermId, downloadPath.val())
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                        }
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                        dialog.modal({
                            body: download_dialog_box,
                            title: 'Download openBIS DataSet',
                            buttons: {
                                'Cancel': {},
                                'Download': {
                                    class: 'btn-primary btn-large',
                                    click: onDownloadClick,
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                            },
                            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"
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                    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">')
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                    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))
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                        .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 () {
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                        var connection_name = $('input[name="connection_name"]:checked').val()
                        var uploadUrl = env.notebook.base_url + 'openbis/dataset/' + connection_name
    
    
                        var notebook = IPython.notebook
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                        var re = /\/notebooks\/(.*?)$/
                        var files = []
    
                        var filepath = window.location.pathname.match(re)[1]
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                        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);
    
    
                        var settings = {
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                            url: uploadUrl,
    
                            processData: false,
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                            type: 'POST',
    
                            dataType: 'json',
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                            data: JSON.stringify(dataSetInfo),
    
                            contentType: 'application/json',
                            success: 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">&times;</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 === '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 =
                                    '<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">&times;</span></button>' +
                                    '<strong>Warning!</strong> Something went wrong.<div>' + data.statusText + '</div></div>'
    
                                // display feedback
                                $('.openbis-feedback').remove()
                                container.prepend(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({
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                            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({
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                            body: uploadDialogBox,
    
                            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}
        })