Make stemma data return consistent; refrain from assuming digraph in edit box. Fixes #28
[scpubgit/stemmaweb.git] / root / js / componentload.js
index 983ac33..3bb43a9 100644 (file)
@@ -47,10 +47,12 @@ function loadTradition( textid, textname, editable ) {
        $('#open_stemma_add').show();
        $('#open_stemma_edit').show();
        $('#open_textinfo_edit').show();
+       $('#relatebutton_label').text('View collation and edit relationships');
     } else {
        $('#open_stemma_add').hide();
        $('#open_stemma_edit').hide();
        $('#open_textinfo_edit').hide();
+       $('#relatebutton_label').text('View collation and relationships');
     }
 
     // Then get and load the actual content.
@@ -73,6 +75,9 @@ function loadTradition( textid, textname, editable ) {
                load_stemma( selectedStemmaID );
        // Set up the relationship mapper button
                $('#run_relater').attr( 'action', _get_url([ "relation", textid ]) );
+               // Set up the download button
+               $('#dl_tradition').attr( 'href', _get_url([ "download", textid ]) );
+               $('#dl_tradition').attr( 'download', selectedTextInfo.name + '.xml' );
        });
 }
 
@@ -88,7 +93,12 @@ function load_textinfo() {
        // Who the owner is
        $('#owner_id').empty().append('no one');
        if( selectedTextInfo.owner ) {
-               $('#owner_id').empty().append( selectedTextInfo.owner );
+               var owneremail = selectedTextInfo.owner;
+               var chop = owneremail.indexOf( '@' );
+               if( chop > -1 ) {
+                       owneremail = owneremail.substr( 0, chop + 1 ) + '...';
+               }
+               $('#owner_id').empty().append( owneremail );
        }
        // Whether or not it is public
        $('#not_public').empty();
@@ -124,7 +134,10 @@ function load_stemma( idx ) {
        selectedStemmaID = idx;
        show_stemmapager();
        if( idx > -1 ) {
-               loadSVG( stemmata[idx] );
+               // Load the SVG and identifier of the stemma
+               var stemmadata = stemmata[idx];
+               loadSVG( stemmadata['svg'] );
+               $('#stemma_identifier').empty().text( stemmadata['name'] );
                // Stexaminer submit action
                var stexpath = _get_url([ "stexaminer", selectedTextID, idx ]);
                $('#run_stexaminer').attr( 'action', stexpath );
@@ -188,9 +201,65 @@ function display_error( jqXHR, el ) {
 function file_selected( e ) {
        if( e.files.length == 1 ) {
                $('#upload_button').button('enable');
+               $('#new_file_name_container').html( '<span id="new_file_name">' + e.files[0].name + '</span>' );
        } else {
                $('#upload_button').button('disable');
+               $('#new_file_name_container').html( '(Use \'pick file\' to select a tradition file to upload.)' );
+       }
+}
+
+// Implement our own AJAX method that uses the features of XMLHttpRequest2
+// but try to let it have a similar interface to jquery.post
+// The data var needs to be a FormData() object.
+// The callback will be given a single argument, which is the response data
+// of the given type.
+
+function post_xhr2( url, data, cb, type ) {
+       if( !type ) {
+               type = 'json';
        }
+       var xhr = new XMLHttpRequest();
+       // Set the expected response type
+       if( type === 'data' ) {
+               xhr.responseType = 'blob';
+       } else if( type === 'xml' ) {
+               xhr.responseType = 'document';
+       } 
+       // Post the form
+       // Gin up an AJAX settings object
+       $.ajaxSetup({ url: url, type: 'POST' });
+       xhr.open( 'POST', url, true );
+       // Handle the results
+       xhr.onload = function( e ) {
+               // Get the response and parse it
+               // Call the callback with the response, whatever it was
+               var xhrs = e.target;
+               if( xhrs.status > 199 && xhrs.status < 300  ) { // Success
+                       var resp;
+                       if( type === 'json' ) {
+                               resp = $.parseJSON( xhrs.responseText );
+                       } else if ( type === 'xml' ) {
+                               resp = xhrs.responseXML;
+                       } else if ( type === 'text' ) {
+                               resp = xhrs.responseText;
+                       } else {
+                               resp = xhrs.response;
+                       }
+                       cb( resp );
+               } else {
+                       // Trigger the ajaxError...
+                       _trigger_ajaxerror( e );
+               }
+       };
+       xhr.onerror = _trigger_ajaxerror;
+       xhr.onabort = _trigger_ajaxerror;
+       xhr.send( data );
+}
+
+function _trigger_ajaxerror( e ) {
+       var xhr = e.target;
+       var thrown = xhr.statusText || 'Request error';
+       jQuery.event.trigger( 'ajaxError', [ xhr, $.ajaxSettings, thrown ]);
 }
 
 function upload_new () {
@@ -199,13 +268,13 @@ function upload_new () {
        var newfile = $('#new_file').get(0).files[0];
        var reader = new FileReader();
        reader.onload = function( evt ) {
-               var formvals = $('#new_tradition').serializeArray();
-               var params = { 'file': evt.target.result, 'filename': newfile.name };
-               $.each( formvals, function( i, o ) {
-                       params[o.name] = o.value;
-               });
+               var data = new FormData();
+               $.each( $('#new_tradition').serializeArray(), function( i, o ) {
+                               data.append( o.name, o.value );
+                       });
+               data.append( 'file', newfile );
                var upload_url = _get_url([ 'newtradition' ]);
-               $.post( upload_url, params, function( ret ) {
+               post_xhr2( upload_url, data, function( ret ) {
                        if( ret.id ) {
                                $('#upload-collation-dialog').dialog('close');
                                refreshDirectory();
@@ -214,7 +283,7 @@ function upload_new () {
                                $('#upload_status').empty().append( 
                                        $('<span>').attr('class', 'error').append( ret.error ) );
                        }
-               });
+               }, 'json' );
        };
        reader.onerror = function( evt ) {
                var err_resp = 'File read error';
@@ -243,6 +312,12 @@ function _get_url( els ) {
 
 
 $(document).ready( function() {
+       // See if we have the browser functionality we need
+       // TODO Also think of a test for SVG readiness
+       if( !!window.FileReader && !!window.File ) {
+               $('#compatibility_check').empty();
+       }
+       
     // call out to load the directory div
     $('#textinfo_container').hide();
     $('#textinfo_waitbox').hide();
@@ -321,10 +396,13 @@ $(document).ready( function() {
                                        // We received a stemma SVG string in return. 
                                        // Update the current stemma sequence number
                                        selectedStemmaID = data.stemmaid;
-                                       // Stash the answer in our SVG array
-                                       stemmata[selectedStemmaID] = data.stemmasvg;
+                                       delete data.stemmaid;
+                                       // Stash the answer in the appropriate spot in our stemma array
+                                       stemmata[selectedStemmaID] = data;
                                        // Display the new stemma
                                        load_stemma( selectedStemmaID );
+                                       // Show the edit button, in case this was the first new stemma
+                                       $('#open_stemma_edit').show();
                                        // Reenable the button and close the form
                                        $(evt.target).button("enable");
                                        $('#stemma-edit-dialog').dialog('close');
@@ -378,6 +456,13 @@ $(document).ready( function() {
                 upload_new();
             }
                  },
+                 pick_file: {
+                   text: 'Pick File',
+                   id: 'pick_file_button',
+                   click: function() {
+                $('#new_file').click();
+            }
+                 },
                  Cancel: function() {
                    $('#upload-collation-dialog').dialog('close');
                  }
@@ -386,6 +471,7 @@ $(document).ready( function() {
                        // Set the upload button to its correct state based on
                        // whether a file is loaded
                        file_selected( $('#new_file').get(0) );
+                       $('#upload_status').empty();
                }
        }).ajaxError( function(event, jqXHR, ajaxSettings, thrownError) {
                // Reset button state