From 8671b45052c18cf46fbec5fffa7eb266afa57192 Mon Sep 17 00:00:00 2001
From: Tomasz Bartosiak <tomasz.bartosiak@mozart.ipipan.waw.pl>
Date: Mon, 18 Apr 2016 12:34:28 +0200
Subject: [PATCH] phraseology -- second attempt on interface

---
 semantics/static/js/semantics_frames.js        | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------------
 semantics/static/js/semantics_lexical_units.js | 57 ++++++++++++++++++++++++++++++---------------------------
 semantics/static/js/semantics_roles.js         |  7 +++++++
 semantics/static/js/semantics_view.js          | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------
 semantics/views.py                             | 29 +++++++++++++++++++++++++++--
 5 files changed, 184 insertions(+), 71 deletions(-)

diff --git a/semantics/static/js/semantics_frames.js b/semantics/static/js/semantics_frames.js
index 6be8fc2..1755676 100644
--- a/semantics/static/js/semantics_frames.js
+++ b/semantics/static/js/semantics_frames.js
@@ -93,6 +93,12 @@ function getFrameDisplay(frame_description){
     display += '<table class="InactiveFrameTable">';
     display += '<tr><td class="ColumnHeader">Rama:</td><td id="frame_' + frame_description.frame_id + '_" class="frame_' + frame_description.frame_id + '_" colspan="' + frame_description.colspan + '" onclick="frameClick(\'frame_' + frame_description.frame_id + '_\', \'frame_' + frame_description.frame_id + '_\')">';
     display += '<span class="Opinion">' + frame_description.status + ' [' + frame_description.frame_id + ']</span>';
+    // display += '</td>';
+    if (frame_description.lemma.include) {
+        display += '<table style="float: right"><td id="' + frame_description.lemma.csv_id + '" class="' + frame_description.lemma.csv_class + '" onclick="var e = arguments[0]; e.stopPropagation(); frameClick(\'' +frame_description.lemma.csv_id + '\', \'' + frame_description.lemma.csv_class + '\')">Lemma</td></table>';
+    }
+    display += '</td>';
+    display += '</tr>';
     display += '<tr>';
     display += '<td class="ColumnHeader">Rola:</td>';
     for (i = 0; i < frame_description.display.roles.length; i++) {
@@ -155,7 +161,7 @@ function newFrame(units) {
     }
     lexical_units_num.push(units_list);
     
-    frame_content[free_frame_id] = {colspan: "1", rowspan: "1", status: "brak", frame_id: "" + x, display: {preferences:[[]], roles:[]}};
+    frame_content[free_frame_id] = {colspan: "1", rowspan: "1", status: "brak", frame_id: "" + x, display: {preferences:[[]], roles:[]}, lemma: {include: false}};
     frames_operations.push({operation: "create_frame", meanings: units_list, id: x});
     free_frame_id = free_frame_id - 1;
 }
@@ -240,13 +246,30 @@ function roleFree(frame_id, field_ids) {
 function addArgument(frame_id, field_ids, roles) {
 
     if (validateRoles(roles)) {
-        frame_content[frame_id].colspan = "" + (parseInt(frame_content[frame_id].colspan) + 1);
-        frame_content[frame_id].display.roles.push({csv_class: 'frame_' + frame_id + '_comp_' + free_complement_id + '_', csv_id: 'frame_' + frame_id + '_comp_' + free_complement_id + '_', argument: ''});
-        var i;
-        for (i = 0; i < frame_content[frame_id].rowspan; i++) {
-            frame_content[frame_id].display.preferences[i].push({csv_class: 'frame_' + frame_id + '_comp_' + free_complement_id + '_', csv_id: 'frame_' + frame_id + '_comp_' + free_complement_id + '_pref_-' + i + '_', preference: ''});
+        if (isLemma(roles)) {
+            if (frame_content[frame_id].lemma.include) {
+                alert("Ta rama ma już pole związane z lematem!");
+            } else {
+		frame_content[frame_id].lemma = {include: true, csv_class: 'frame_' + frame_id + '_lemma_comp_' + free_complement_id + '_', csv_id: 'frame_' + frame_id + '_lemma_comp_' + free_complement_id + '_'};
+		connected['frame_' + frame_id + '_lemma_comp_' + free_complement_id + '_'] = field_ids;
+                var complement_id_num = free_complement_id;
+                free_complement_id = free_complement_id - 1;
+                var complement_id = "frame_" + highlighted_id + "_lemma_comp_" + complement_id_num + "_";
+                var conn_complement_id = "frame_" + highlighted_id + "_comp_" + complement_id_num + "_";
+            }
+        } else {
+	    frame_content[frame_id].colspan = "" + (parseInt(frame_content[frame_id].colspan) + 1);
+	    frame_content[frame_id].display.roles.push({csv_class: 'frame_' + frame_id + '_comp_' + free_complement_id + '_', csv_id: 'frame_' + frame_id + '_comp_' + free_complement_id + '_', argument: ''});
+	    var i;
+	    for (i = 0; i < frame_content[frame_id].rowspan; i++) {
+		frame_content[frame_id].display.preferences[i].push({csv_class: 'frame_' + frame_id + '_comp_' + free_complement_id + '_', csv_id: 'frame_' + frame_id + '_comp_' + free_complement_id + '_pref_-' + i + '_', preference: ''});
+	    }
+	    connected['frame_' + frame_id + '_comp_' + free_complement_id + '_'] = field_ids;
+            var complement_id_num = free_complement_id;
+            free_complement_id = free_complement_id - 1;
+            var complement_id = "frame_" + highlighted_id + "_comp_" + complement_id_num + "_";
+            var conn_complement_id = complement_id;
         }
-        connected['frame_' + frame_id + '_comp_' + free_complement_id + '_'] = field_ids;
         
         for(i = 0; i < field_ids.length; i++) {
             if (typeof(connected_reverse[field_ids[i]]) == 'undefined') {
@@ -254,44 +277,46 @@ function addArgument(frame_id, field_ids, roles) {
             }
             connected_reverse[field_ids[i]].push('frame_' + frame_id + '_');
         }
-        
-        var complement_id = free_complement_id;
-        free_complement_id = free_complement_id - 1;
 
         for (i = 0; i < frame_content[frame_id].display.roles.length; i++) {
-            if (frame_content[frame_id].display.roles[i].csv_id == 'frame_' + frame_id + '_comp_' + complement_id + '_') {
+            if (frame_content[frame_id].display.roles[i].csv_id == complement_id) {
                 frame_content[frame_id].display.roles[i].argument = roles;
             }
         }
         
-        frames_operations.push({operation: 'add_argument', frame_id: frame_id, id: complement_id, role: roles});
+        frames_operations.push({operation: 'add_argument', frame_id: frame_id, id: complement_id_num, role: roles});
         for (i = 0; i < field_ids.length; i++) {
-            frames_operations.push({operation: 'connect', arg: 'frame_' + frame_id + '_comp_' + complement_id + '_', connect: field_ids[i]});
+            frames_operations.push({operation: 'connect', arg: conn_complement_id, connect: field_ids[i]});
         }
 
         return complement_id;
     } else {
+        alert("Wybrano niepoprawny zestaw ról!");
         return false;
     }
 
 }
 
-function removeArgument(frame_id, complement_id) {
+function removeArgument(frame_id, complement_id, argument) {
     var pos = -1;
-    var arg = "frame_" + frame_id + "_comp_" + complement_id + "_"
+    var arg = argument;
     
-    var i;
-    for (i = 0; i < frame_content[frame_id].display.roles.length; i++) {
-        if (frame_content[frame_id].display.roles[i].csv_id == arg) {
-            pos = i;
-        }
-    }
-    
-    frame_content[frame_id].display.roles.splice(pos, 1);
-    
-    var j;
-    for (j = 0; j < frame_content[frame_id].display.preferences.length; j++) {
-        frame_content[frame_id].display.preferences[j].splice(pos, 1);
+    if (argument.split('_').length == 5) { // zwykły argument
+	var i;
+	for (i = 0; i < frame_content[frame_id].display.roles.length; i++) {
+	    if (frame_content[frame_id].display.roles[i].csv_id == arg) {
+		pos = i;
+	    }
+	}
+
+	frame_content[frame_id].display.roles.splice(pos, 1);
+
+	var j;
+	for (j = 0; j < frame_content[frame_id].display.preferences.length; j++) {
+	    frame_content[frame_id].display.preferences[j].splice(pos, 1);
+	}
+    } else { // argument leksykalny
+        frame_content[frame_id].lemma.include = false;
     }
     
     frames_operations.push({operation: 'remove_argument', frame_id: frame_id, complement_id: complement_id});
@@ -462,12 +487,16 @@ function saveFrames() {
     else {
         frameClick("");
         $.post(ajax_modify_frames, {"operations": JSON.stringify(frames_operations), "lemma_id": lemma_id}, function(data){
-            getFrames(data.frames_display);
-            displayFrames();
-            memorizeConnections(data.connections.connected, data.connections.connected_reverse);
-            $("#semantic-frames-count").empty();
-  			$("#semantic-frames-count").append(data.frames_count);
-  			updateSchemataConnections();
+            $.getJSON(ajax_units, {"lemma_id": window.lemma_id}, function(units) {
+                memorizeLexicalUnits(units.lexical_units);
+                basicLexicalUnitsData(units.informations);
+		getFrames(data.frames_display);
+		displayFrames();
+		memorizeConnections(data.connections.connected, data.connections.connected_reverse);
+		$("#semantic-frames-count").empty();
+                $("#semantic-frames-count").append(data.frames_count);
+                updateSchemataConnections();
+            });
         }, 'json');
         frames_operations = [];
     }
diff --git a/semantics/static/js/semantics_lexical_units.js b/semantics/static/js/semantics_lexical_units.js
index c0741d2..cdb252b 100644
--- a/semantics/static/js/semantics_lexical_units.js
+++ b/semantics/static/js/semantics_lexical_units.js
@@ -198,34 +198,31 @@ function getMeaningsSelectionForFrame(frame_id) {
 
     display += "<div>";
 
-    var i;
-    var roles = frame_content[frame_id].display.roles;
-    for (i = 0; i < roles.length; i++) {
-        if (isPOL(frame_id, i)) {
-            var j;
-            for (j = 0; j < connected[roles[i].csv_class].length; j++) {
-                var options = [];
-		var sch = connected[roles[i].csv_class][j].split("pos")[0];
-	        var pos = connected[roles[i].csv_class][j].split("arg")[0];
-	        var k;
-                for (k = 0; k < schemas_content[sch].display.arguments[0].length; k++) {
-                    if (schemas_content[sch].display.arguments[0][k].csv_class == pos) {
-			var l;
-                        for (l = 0; l < schemas_content[sch].display.arguments[0][k].lex.length; l++) {
-			    options.push(schemas_content[sch].display.arguments[0][k].lex[l]);
-                        }
-                    } 
-                } 
-                var temp; // TODO: temporal solution for multiple schemata
-                if (hasRefl(sch)) {
-                    temp = [['się'], options]
-                } else {
-                    temp = [options]; 
-                }
-	        lexicalisation.push(temp);
-            } 
+    if (frame_content[frame_id].lemma.include) {
+        var lem = frame_content[frame_id].lemma.csv_class;
+	var j;
+	for (j = 0; j < connected[lem].length; j++) {
+	    var options = [];
+	    var sch = connected[lem][j].split("pos")[0];
+	    var pos = connected[lem][j].split("arg")[0];
+	    var k;
+	    for (k = 0; k < schemas_content[sch].display.arguments[0].length; k++) {
+		if (schemas_content[sch].display.arguments[0][k].csv_class == pos) {
+		    var l;
+		    for (l = 0; l < schemas_content[sch].display.arguments[0][k].lex.length; l++) {
+			options.push(schemas_content[sch].display.arguments[0][k].lex[l]);
+		    }
+		} 
+	    } 
+	    var temp; // TODO: temporal solution for multiple schemata
+	    if (hasRefl(sch)) {
+		temp = [['się'], options]
+	    } else {
+		temp = [options]; 
+	    }
+	    lexicalisation.push(temp);
 	} 
-    }
+    } 
 
     display += getFormForLexicalisation(lexicalisation);
 
@@ -293,6 +290,12 @@ function lexicalisationForm(tokenised) {
     var display = "";
     var i;
     for (i = 0; i < tokenised.length; i++) {
+        var j;
+        for (j = 0; j < lexical_units.length; j++) {
+            if (base + " " + tokenised[i].join(" ") == lexical_units[j].base) {
+                return "";
+            }
+        }
         display += "<input type = \"checkbox\" name = \"mwe\" value = \"" + base + " " + tokenised[i].join(" ") + "\">"; // TODO: unikalne wartości, wartość => dodanie odpowiedniej jednostki (nazwa jednostki w wartości?)
         display += base + " " + tokenised[i].join(" ") + "<br\>";
     }
diff --git a/semantics/static/js/semantics_roles.js b/semantics/static/js/semantics_roles.js
index a5072a2..effafd6 100644
--- a/semantics/static/js/semantics_roles.js
+++ b/semantics/static/js/semantics_roles.js
@@ -45,6 +45,13 @@ function rolesToHtml(roles_display, full){
     return table;
 }
 
+function isLemma(roles) {
+    if (roles.length != 1) {
+        return false;
+    }
+    return (role_name[roles[0]] == 'Lemma');
+}
+
 function memorizeRoles(roles_display, roles_full){
     roles_display_table = rolesToHtml(roles_display, false);
     roles_display_table_full = rolesToHtml(roles_full, true);
diff --git a/semantics/static/js/semantics_view.js b/semantics/static/js/semantics_view.js
index 3f4066b..6a36f35 100644
--- a/semantics/static/js/semantics_view.js
+++ b/semantics/static/js/semantics_view.js
@@ -769,7 +769,7 @@ function removeFromFrame() {
         
     }
     if (op == "add_realization") {
-        // arg = "frame_26_comp_36_"
+        // arg = "frame_26_comp_36_(lemma_)"
         
         var frame_id = parseInt(arg.split('_')[1]);
         var complement_id = parseInt(arg.split('_')[3]);
@@ -777,8 +777,8 @@ function removeFromFrame() {
         var h = "frame_" + highlighted_id + "_";
         
         frameClick(h);
-
-        removeArgument(frame_id, complement_id);
+  
+        removeArgument(frame_id, complement_id, arg);
         
         op = "add_argument";
         arg = "";
@@ -812,7 +812,7 @@ function removeFromFrame() {
 //////////////////////////// Display ////////////////////////////
 
 function frameClick(clicked_id) {
-	
+
     if (clicked_id == "") {
         deselect();
         highlighted_id = "";
@@ -866,6 +866,38 @@ function frameClick(clicked_id) {
                 $('#change_lus').removeAttr('disabled');
 		$('#change_opinion').removeAttr('disabled');
             }
+        } else if (clicked_id.split('_')[4] == 'lemma') { // part of lemma click
+            frame_id = clicked_id.split('_')[1]
+            
+            if (highlighted_id != "") {
+                deselect();
+            }
+            if (semantics_selected_id == clicked_id) {
+                highlighted_id = "";
+                semantics_selected_id = "";
+                op = "none";
+                
+                $('#assign_role').attr('disabled', "True");
+                $('#add_preference').attr('disabled', "True");
+                $('#delete').attr('disabled', "True");
+		$('#multi_lus').attr('disabled', "True");
+                $('#change_lus').attr('disabled', "True");
+		$('#change_opinion').attr('disabled', "True");
+            } else {
+                select(frame_id, clicked_id);
+
+                highlighted_id = frame_id;
+                semantics_selected_id = clicked_id;
+                op = "add_realization";
+                arg = clicked_id //.split('pref')[0]
+                
+                $('#assign_role').attr('disabled', "True");
+                $('#add_preference').attr('disabled', "True");
+                $('#delete').removeAttr('disabled');
+		$('#multi_lus').removeAttr('disabled');
+                $('#change_lus').removeAttr('disabled');
+		$('#change_opinion').removeAttr('disabled');
+            }
         } else { // argument click
             frame_id = clicked_id.split('_')[1]
             
@@ -947,6 +979,19 @@ function selectFrame(frame_id, clicked_id) {
             $('#' + functionCsvId(connected[roles[i].csv_class][j])).css('color', '');
         }
     }
+
+    var lemma = frame_content[frame_id].lemma;
+    if (lemma.include) {
+        var style = {type: 'background-color', value: 'white'};
+        $('#' + lemma.csv_id).css(style.type, style.value);
+        var j;
+        for (j = 0; j < connected[lemma.csv_class].length; j++) {
+            $('#' + connected[lemma.csv_class][j]).css(style.type, style.value);
+            $('#' + connected[lemma.csv_class][j]).css('color', '');
+            $('#' + functionCsvId(connected[lemma.csv_class][j])).css(style.type, style.value);
+            $('#' + functionCsvId(connected[lemma.csv_class][j])).css('color', '');
+        }
+    }
     
     $("#" + clicked_id).css('border-width', '5px');
 
@@ -1119,7 +1164,7 @@ function schemaClick(class_id, lex) {
         }
         field_ids = [class_id];
     }
-    
+
     if (control == "connect") {
         if (op == "none") {
             return;
@@ -1153,7 +1198,7 @@ function schemaClick(class_id, lex) {
                                     
                                     if (complement_id) {
                                         var h = "frame_" + highlighted_id + "_";
-                                        var a = "frame_" + highlighted_id + "_comp_" + complement_id + "_";
+                                        var a = complement_id;  //"frame_" + highlighted_id + "_comp_" + complement_id + "_";
                                         
                                         // re-draw and re-color frame
                                         frameClick(h);
@@ -1162,9 +1207,9 @@ function schemaClick(class_id, lex) {
                                         
                                         result = true;
                                         $.prompt.close();
-                                    } else {
+                                    } /*else {
                                         alert("Wybrano niepoprawne role!");
-                                    }
+                                    } */ 
                                 }
                                 
                             }
@@ -1188,7 +1233,11 @@ function schemaClick(class_id, lex) {
             if (arg == "") {
                 return;
             } else {
-                // arg = "frame_26_comp_36_"
+                // arg = "frame_26_comp_36_(lemma_)"
+                if (arg.split('_')[4] == 'lemma' && lex.length == 0) {
+                    alert("Nie można podłączyć do lematu!");
+                    return;
+                }
                 var frame_id = parseInt(parseInt(arg.split('_')[1]));
                 var i, j;
                 var can_connect = false;
diff --git a/semantics/views.py b/semantics/views.py
index 8a4001d..8ea0817 100644
--- a/semantics/views.py
+++ b/semantics/views.py
@@ -115,7 +115,10 @@ def create_frames_context(lemma_id, user):
             frame_display["lexical_units"].append({"id": str(lu.id), "base": lu.base, "sense": str(lu.sense)})
         for frame in type_frames[t]:
             # frame_complements = Complement.objects.filter(frame=frame)
-            frame_complements = frame.complements.all()
+            # frame_complements = frame.complements.all()
+            lemma_role = SemanticRole.objects.get(role="Lemma")
+            frame_complements = frame.complements.all().exclude(roles=lemma_role)
+            lemma_argument = frame.complements.filter(roles=lemma_role)
         
             # classes and first frame/position part of identifiers
             frame_ids = [u'frame_' + str(frame.id) + '_comp_' + str(complement.id) + '_' for complement in frame_complements]
@@ -174,7 +177,29 @@ def create_frames_context(lemma_id, user):
                 status = u'pewna'
             else:
                 status = frame.opinion.value
-            frame_display["frames"].append({"frame_id": str(frame.id), "colspan": str(max(len(frame_roles), 1)), "rowspan": str(frame_preferences_rowspan), "status": status, "display": display})
+            if len(lemma_argument) > 0:
+                csv = u'frame_' + str(frame.id) + '_comp_' + str(lemma_argument[0].id) + '_lemma_' 
+                lemma_info = {"include": True, "csv_id": csv, "csv_class": csv}
+                if csv not in complement_arguments:
+                    complement_arguments[csv] = []
+                
+                for schema_position in lemma_argument[0].realizations.all():
+                    schema = schema_position.frame
+                    position = schema_position.position
+                    argument = schema_position.argument
+                    alternation = schema_position.alternation
+                    realization_id = u'schema_' + str(schema.id) + u'_pos_' + str(position.id) + '_arg_' + str(argument.id) + '_' + 'alt_' + str(alternation) + '_'
+                    complement_arguments[csv].append(realization_id)
+                    if realization_id not in arguments_frame_connected:
+                        arguments_frame_connected[realization_id] = []
+                    arguments_frame_connected[realization_id].append('frame_' + str(frame.id) + '_')
+                    if schema.id in alternations[frame.id]:
+                        alternations[frame.id][schema.id] = max(alternations[frame.id][schema.id], alternation)
+                    else:
+                        alternations[frame.id][schema.id] = alternation      
+            else:
+                lemma_info = {"include": False}
+            frame_display["frames"].append({"frame_id": str(frame.id), "colspan": str(max(len(frame_roles), 1)), "rowspan": str(frame_preferences_rowspan), "status": status, "display": display, "lemma": lemma_info})
             
             for complement, complement_class in zip(frame_complements, frame_ids):
                 if complement_class not in complement_arguments:
--
libgit2 0.22.2