Skip to content
Snippets Groups Projects
dialog.js 21 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
    
            function show_available_connections (data, conn_table) {
                if (!currentDownloadPath) {
                    currentDownloadPath = data.cwd
                }
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                var table = $('<table>').addClass('table-bordered table-striped table-condensed')
    
                var thead = $('<thead>')
                var title_row = $('<tr>')
                     .append($('<th>')
                         .text('')
                     )
                     .append($('<th>')
                         .text('Name')
                     )
                     .append($('<th>')
                         .text('URL')
                     )
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                    .append($('<th>')
                        .text('Status')
                    )
    
                title_row.appendTo(thead)
                thead.appendTo(table)
    
                data.connections.forEach( function(item, index, arr) {
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                    var conn = $('<input type="radio" name="connection_name">')
                        .attr("value", item.name)
                        .attr("url", item.url)
    
                    conn.change( function() {
                        currentConnection = item.name
                    })
    
                    if (item.name === currentConnection) {
                        conn.prop('checked', true)
                    }
                    else {
                        conn.prop('checked', false)
                    }
                    var row = $('<tr>')
                        .append(
                            $('<td>').append(conn)
                        )
                        .append($('<td>')
                            .text(item.name)
                        )
                        .append($('<td>')
                            .text(item.url)
                        )
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                        .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)
                })
    
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                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"/>')
                    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 = $("<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',
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                            }
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                            utils.ajax(settings)
    
                                .done(function(data) {
                                    show_datasets_table(data, datasets_table)
                                })
                                .fail(function(data) {
                                    alert('Error:' + data.statusText)
                                })
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                        })
                        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'
                            }
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                            // 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">&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_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">&times;</span></button>' +
                                        '<strong>Error: </strong>Dataset was not downloaded.<div>' + data.statusText + '</div></div>'
    
                                    // display feedback
                                    $('.openbis-feedback').remove()
                                    container.prepend(feedback)
                                })
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                        function onDownloadClick() {
                            connection_name = $('input[name="connection_name"]:checked').val()
                            if (typeof connection_name === "undefined") {
                                alert('please choose a connection')
                                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
                            }
                            downloadDataset(selectedPermId, downloadPath.val())
                        }
    
    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) {
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                    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">')
    
    
    Swen Vermeul's avatar
    Swen Vermeul committed
                    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 () {
    
    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}
        })