Skip to content
Snippets Groups Projects
dialog.js 22.7 KiB
Newer Older
  • Learn to ignore specific revisions
  • define([
            "base/js/namespace",
            "base/js/dialog",
            "base/js/utils",
            "jquery"
        ],
    
        function(IPython, dialog, utils, $) {
    
            var currentConnection = ''
    
    Swen Vermeul's avatar
    Swen Vermeul committed
            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']
    
                for (title of titles) {
                    thead_row.insertCell().textContent = title
                }
                //titles.forEach( function(item, index) {
                //    thead_row.insertCell().textContent = item
                //})
    
                tbody = table.createTBody()
    
                for (item of data.connections) {
                //data.connections.forEach( function(item) {
    
                    //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 of item.ds_types) {
    
                                option = document.createElement("OPTION")
                                option.textContent = ds_type.code
                            }
                        }
                    }
    
                    conn.checked = 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)
    
    Swen Vermeul's avatar
    Swen Vermeul committed
            }
    
            function show_datasets_table( data, datasets_table) {
    
                var table = document.createElement("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.name = "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)
    
            function getOpenBisConnections(env) {
    
                 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)
    
            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)
            }
    
    
            function writeMetaData(data) {
                var notebook = IPython.notebook
                if (typeof notebook.metadata.openbis_connections === 'undefined') {
                    notebook.metadata.openbis_connections = {}
                }
                if (typeof notebook.metadata.openbis_connections[data.url] === 'undefined') {
                    notebook.metadata.openbis_connections[data.url] = {}
                }
                // store metadata about the downloaded files into the notebook-metadata
                if (data.permId) {
                    notebook.metadata.openbis_connections[data.url][data.permId] = {
                        "permId": data.permId,
                        "path": data.path,
                        "dataStore": data.dataStore,
                        "location": data.location,
                        "size": data.size,
                        "status": data.statusText
                    }
                }
    
            }
    
    
            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)
    
    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 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) {
    
    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 url = env.notebook.base_url + 'openbis/sample/' + connection_name + '/' + encodeURIComponent(currentSampleIdentifier)
    
    
                            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)
                                })
    
    
                        showDataSets.appendChild(sampleIdentifier)
                        showDataSets.appendChild(show_datasets_btn)
                        showDataSets.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(showDataSets)
    
                        download_dialog_box.appendChild(dataset_direct)
                        download_dialog_box.appendChild(path)
    
    
                        function downloadDataset(selected_conn, selectedPermIds, downloadPath) {
                            var connection_name = selected_conn.value
    
                            for (permId of selectedPermIds) {
                                var downloadUrl = env.notebook.base_url + 'openbis/dataset/'
                                    + connection_name + '/' + permId + '/' + encodeURIComponent(downloadPath)
    
                                fetch(downloadUrl)
                                    .then( function(response) {
                                        if (response.ok) {
                                            response.json()
                                                .then( function(data) {
                                                    createFeedback('success', data.statusText)
    
                                                    // successful download:
                                                    // write statusText from returned data to notebooks metadata
                                                    writeMetaData(data)
    
                                                    // keep current download path for later use
                                                    currentDownloadPath = downloadPath
                                                })
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                                        }
    
                                        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)
                                    })
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                        function onDownloadClick() {
    
                            var selected_conn = document.querySelector('input[name=connection_name]:checked')
                            if (! selected_conn) {
    
                                alert('please choose a connection')
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                                return false
                            }
    
                            var selectedPermIds = []
    
                            for (row of document.querySelectorAll('input[name=permId]:checked') ) {
                                selectedPermIds.push(row.value)
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                            }
    
                            if (datasetPermId.value) {
                                selectedPermIds.push(datasetPermId.value)
                            }
                            if (!selectedPermIds) {
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                                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)
    
    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"
    
                    getOpenBisConnections(env)
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                        .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 () {
    
                        //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
    
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                        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
    
                                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({
    
    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}
        })