X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=root%2Fjs%2Frelationship.js;h=4cb62f14609e358505b7707ae6108998ef84eda6;hb=30d0ba1eb65182ce262cc2e67a20d70519b0a419;hp=3fa40d1bc41b2eec15c8310eff4bc0bbb165d3a5;hpb=6666d1110a2a09fc7adca2976ca322ea5210f2a4;p=scpubgit%2Fstemmaweb.git diff --git a/root/js/relationship.js b/root/js/relationship.js index 3fa40d1..4cb62f1 100644 --- a/root/js/relationship.js +++ b/root/js/relationship.js @@ -5,36 +5,12 @@ var start_element_height = 0; var reltypes = {}; var readingdata = {}; -function getTextPath() { - var currpath = window.location.pathname; - // Get rid of trailing slash - if( currpath.lastIndexOf('/') == currpath.length - 1 ) { - currpath = currpath.slice( 0, currpath.length - 1) - }; - // Get rid of query parameters - if( currpath.lastIndexOf('?') != -1 ) { - currpath = currpath.slice( 0, currpath.lastIndexOf('?') ); - }; - var path_elements = currpath.split('/'); - var textid = path_elements.pop(); - var basepath = path_elements.join( '/' ); - var path_parts = [ basepath, textid ]; - return path_parts; -} - -function getRelativePath() { - var path_parts = getTextPath(); - return path_parts[0]; -} - function getTextURL( which ) { - var path_parts = getTextPath(); - return path_parts[0] + '/' + path_parts[1] + '/' + which; + return basepath + textid + '/' + which; } function getReadingURL( reading_id ) { - var path_parts = getTextPath(); - return path_parts[0] + '/' + path_parts[1] + '/reading/' + reading_id; + return basepath + textid + '/reading/' + reading_id; } // Make an XML ID into a valid selector @@ -52,8 +28,8 @@ function node_dblclick_listener( evt ) { // Set the easy properties first $('#reading-form').dialog( 'option', 'title', 'Reading information for "' + reading_info['text'] + '"' ); $('#reading_id').val( reading_id ); - $('#reading_is_nonsense').attr( 'checked', reading_info['is_nonsense'] ); - $('#reading_grammar_invalid').attr( 'checked', reading_info['grammar_invalid'] ); + toggle_checkbox( $('#reading_is_nonsense'), reading_info['is_nonsense'] ); + toggle_checkbox( $('#reading_grammar_invalid'), reading_info['grammar_invalid'] ); // Use .text as a backup for .normal_form var normal_form = reading_info['normal_form']; if( !normal_form ) { @@ -71,27 +47,39 @@ function node_dblclick_listener( evt ) { $('#reading-form').dialog("open"); } +function toggle_checkbox( box, value ) { + if( value == null ) { + value = false; + } + box.attr('checked', value ); +} + function morphology_form ( lexlist ) { - $('#morphology').empty(); - $.each( lexlist, function( idx, lex ) { - var morphoptions = []; - if( 'wordform_matchlist' in lex ) { - $.each( lex['wordform_matchlist'], function( tdx, tag ) { - var tagstr = stringify_wordform( tag ); - morphoptions.push( tagstr ); + if( lexlist.length ) { + $('#morph_outer').show(); + $('#morphology').empty(); + $.each( lexlist, function( idx, lex ) { + var morphoptions = []; + if( 'wordform_matchlist' in lex ) { + $.each( lex['wordform_matchlist'], function( tdx, tag ) { + var tagstr = stringify_wordform( tag ); + morphoptions.push( tagstr ); + }); + } + var formtag = 'morphology_' + idx; + var formstr = ''; + if( 'form' in lex ) { + formstr = stringify_wordform( lex['form'] ); + } + var form_morph_elements = morph_elements( + formtag, lex['string'], formstr, morphoptions ); + $.each( form_morph_elements, function( idx, el ) { + $('#morphology').append( el ); }); - } - var formtag = 'morphology_' + idx; - var formstr = ''; - if( 'form' in lex ) { - formstr = stringify_wordform( lex['form'] ); - } - var form_morph_elements = morph_elements( - formtag, lex['string'], formstr, morphoptions ); - $.each( form_morph_elements, function( idx, el ) { - $('#morphology').append( el ); }); - }); + } else { + $('#morph_outer').hide(); + } } function stringify_wordform ( tag ) { @@ -129,15 +117,18 @@ function color_inactive ( el ) { // If the reading info has any non-disambiguated lexemes, color it yellow; // otherwise color it green. $(el).attr( {stroke:'green', fill:'#b3f36d'} ); - $.each( reading_info['lexemes'], function ( idx, lex ) { - if( !lex['is_disambiguated'] ) { - $(el).attr( {stroke:'orange', fill:'#fee233'} ); - } - }); + if( reading_info ) { + $.each( reading_info['lexemes'], function ( idx, lex ) { + if( !lex['is_disambiguated'] || lex['is_disambiguated'] == 0 ) { + $(el).attr( {stroke:'orange', fill:'#fee233'} ); + } + }); + } } function relemmatize () { // Send the reading for a new lemmatization and reopen the form. + $('#relemmatize_pending').show(); var reading_id = $('#reading_id').val() ncpath = getReadingURL( reading_id ); form_values = { @@ -153,6 +144,7 @@ function relemmatize () { } else { alert("Could not relemmatize as requested: " + data['error']); } + $('#relemmatize_pending').hide(); }); } @@ -168,10 +160,11 @@ function svgEnlargementLoaded() { $("#loading_message").offset( { 'top': lo_height / 2 - $("#loading_message").height() / 2, 'left': lo_width / 2 - $("#loading_message").width() / 2 }); - //Set viewbox widht and height to widht and height of $('#svgenlargement svg'). - $('#update_workspace_button').data('locked', false); - $('#update_workspace_button').css('background-position', '0px 44px'); - //This is essential to make sure zooming and panning works properly. + if( editable ) { + // Show the update toggle button. + $('#update_workspace_button').data('locked', false); + $('#update_workspace_button').css('background-position', '0px 44px'); + } var rdgpath = getTextURL( 'readings' ); $.getJSON( rdgpath, function( data ) { readingdata = data; @@ -191,6 +184,8 @@ function svgEnlargementLoaded() { } } + //Set viewbox width and height to width and height of $('#svgenlargement svg'). + //This is essential to make sure zooming and panning works properly. svg_root.viewBox.baseVal.width = graph_svg.attr( 'width' ); svg_root.viewBox.baseVal.height = graph_svg.attr( 'height' ); //Now set scale and translate so svg height is about 150px and vertically centered in viewbox. @@ -209,32 +204,42 @@ function svgEnlargementLoaded() { } function add_relations( callback_fn ) { - var basepath = getRelativePath(); + // Add the relationship types to the keymap list + $.each( relationship_types, function(index, typedef) { + li_elm = $('
  • ').css( "border-color", + relation_manager.relation_colors[index] ).text(typedef.name); + li_elm.append( $('
    ').attr('class', 'key_tip_container').append( + $('
    ').attr('class', 'key_tip').text(typedef.description) ) ); + $('#keymaplist').append( li_elm ); + }); + // Now fetch the relationships themselves and add them to the graph + var rel_types = $.map( relationship_types, function(t) { return t.name }); + // Save this list of names to the outer element data so that the relationship + // factory can access it + $('#keymap').data('relations', rel_types); var textrelpath = getTextURL( 'relationships' ); - $.getJSON( basepath + '/definitions', function(data) { - var rel_types = data.types.sort(); - $.getJSON( textrelpath, - function(data) { - $.each(data, function( index, rel_info ) { - var type_index = $.inArray(rel_info.type, rel_types); - var source_found = get_ellipse( rel_info.source ); - var target_found = get_ellipse( rel_info.target ); - if( type_index != -1 && source_found.size() && target_found.size() ) { - var relation = relation_manager.create( rel_info.source, rel_info.target, type_index ); - relation.data( 'type', rel_info.type ); - relation.data( 'scope', rel_info.scope ); - relation.data( 'note', rel_info.note ); - var node_obj = get_node_obj(rel_info.source); - node_obj.set_draggable( false ); - node_obj.ellipse.data( 'node_obj', null ); - node_obj = get_node_obj(rel_info.target); - node_obj.set_draggable( false ); - node_obj.ellipse.data( 'node_obj', null ); - } - }); - callback_fn.call(); - }); - }); + $.getJSON( textrelpath, function(data) { + $.each(data, function( index, rel_info ) { + var type_index = $.inArray(rel_info.type, rel_types); + var source_found = get_ellipse( rel_info.source ); + var target_found = get_ellipse( rel_info.target ); + if( type_index != -1 && source_found.size() && target_found.size() ) { + var relation = relation_manager.create( rel_info.source, rel_info.target, type_index ); + relation.data( 'type', rel_info.type ); + relation.data( 'scope', rel_info.scope ); + relation.data( 'note', rel_info.note ); + if( editable ) { + var node_obj = get_node_obj(rel_info.source); + node_obj.set_draggable( false ); + node_obj.ellipse.data( 'node_obj', null ); + node_obj = get_node_obj(rel_info.target); + node_obj.set_draggable( false ); + node_obj.ellipse.data( 'node_obj', null ); + } + } + }); + callback_fn.call(); + }); } function get_ellipse( node_id ) { @@ -264,7 +269,7 @@ function node_obj(ellipse) { } this.set_draggable = function( draggable ) { - if( draggable ) { + if( draggable && editable ) { $(self.ellipse).attr( {stroke:'black', fill:'#fff'} ); $(self.ellipse).parent().mousedown( this.mousedown_listener ); $(self.ellipse).parent().hover( this.enter_node, this.leave_node ); @@ -529,6 +534,9 @@ function relation_factory() { dialog_aria.offset({ left: nx, top: ny }); } this.remove = function( relation_id ) { + if( !editable ) { + return; + } var relation = $( jq( relation_id ) ); relation.remove(); } @@ -631,73 +639,70 @@ $(document).ready(function () { 'cursor' : '-moz-grab' }); - - $( "#dialog-form" ).dialog({ - autoOpen: false, - height: 270, - width: 290, - modal: true, - buttons: { - "Ok": function() { - $('#status').empty(); - form_values = $('#collapse_node_form').serialize(); - ncpath = getTextURL( 'relationships' ); - $(':button :contains("Ok")').attr("disabled", true); - var jqjson = $.post( ncpath, form_values, function(data) { - $.each( data, function(item, source_target) { - var source_found = get_ellipse( source_target[0] ); - var target_found = get_ellipse( source_target[1] ); - if( source_found.size() && target_found.size() ) { - var relation = relation_manager.create( source_target[0], source_target[1], $('#rel_type')[0].selectedIndex-1 ); - relation.data( 'type', $('#rel_type :selected').text() ); + if( editable ) { + $( "#dialog-form" ).dialog({ + autoOpen: false, + height: 270, + width: 290, + modal: true, + buttons: { + "Ok": function( evt ) { + $(evt.target).button("disable"); + $('#status').empty(); + form_values = $('#collapse_node_form').serialize(); + ncpath = getTextURL( 'relationships' ); + var jqjson = $.post( ncpath, form_values, function(data) { + $.each( data, function(item, source_target) { + var source_found = get_ellipse( source_target[0] ); + var target_found = get_ellipse( source_target[1] ); + var relation_found = $.inArray( source_target[2], $('#keymap').data('relations') ); + if( source_found.size() && target_found.size() && relation_found > -1 ) { + var relation = relation_manager.create( source_target[0], source_target[1], relation_found ); + relation.data( 'type', source_target[2] ); relation.data( 'scope', $('#scope :selected').text() ); relation.data( 'note', $('#note').val() ); relation_manager.toggle_active( relation.attr('id') ); } - }); - $( "#dialog-form" ).dialog( "close" ); - }, 'json' ); - }, - Cancel: function() { - $( this ).dialog( "close" ); - } - }, - create: function(event, ui) { - $(this).data( 'relation_drawn', false ); - //TODO? Err handling? - var basepath = getRelativePath(); - var jqjson = $.getJSON( basepath + '/definitions', function(data) { - var types = data.types.sort(); - $.each( types, function(index, value) { - $('#rel_type').append( $('
  • ').css( "border-color", relation_manager.relation_colors[index] ).text(value) ); - }); - var scopes = data.scopes; - $.each( scopes, function(index, value) { - $('#scope').append( $('