From 4481197cf6b1697344116a4c1b7c4e85adbe18fe Mon Sep 17 00:00:00 2001
From: Tomasz Bartosiak <tomasz.bartosiak@mozart.ipipan.waw.pl>
Date: Tue, 27 Oct 2015 17:15:57 +0100
Subject: [PATCH] Removed possibility of assiging two roles to single syntactic phrase/position

---
 semantics/static/js/semantics_connections.js |   5 ++---
 semantics/static/js/semantics_frames.js      |  15 +++++++++++++++
 semantics/static/js/semantics_view.js        | 132 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------------------------------
 semantics/templates/semantics.html           |   2 +-
 semantics/views.py                           |  13 ++++---------
 5 files changed, 101 insertions(+), 66 deletions(-)

diff --git a/semantics/static/js/semantics_connections.js b/semantics/static/js/semantics_connections.js
index 93c6ba4..114d7b8 100644
--- a/semantics/static/js/semantics_connections.js
+++ b/semantics/static/js/semantics_connections.js
@@ -1,10 +1,9 @@
 var connected = {};     // dictionaries of connections and disconnections between frames and schemas 
-var disconnected = {};
 
 
-function memorizeConnections(arguments_connected, arguments_disconnected){
+function memorizeConnections(arguments_connected, frames_connection){
     connected = arguments_connected;
-    disconnected = arguments_disconnected;
+    connected_reverse = frames_connection;
 }
 
 function getConnected(frame_id) { /* TODO */
diff --git a/semantics/static/js/semantics_frames.js b/semantics/static/js/semantics_frames.js
index 78e0276..87bbed0 100644
--- a/semantics/static/js/semantics_frames.js
+++ b/semantics/static/js/semantics_frames.js
@@ -197,6 +197,16 @@ function removeFrame(frame_id) {
     frames_operations.push({operation: "remove_frame", id: frame_id, units: units, connections: connections});
 }
 
+function roleFree(frame_id, field_ids) {
+    var i;
+    for (i = 0; i < field_ids.length; i++) {
+        if (connected_reverse[field_ids[i]].indexOf('frame_' + frame_id + '_') >= 0) {
+            return false;
+        }
+    }
+    return true;
+}
+
 function addArgument(frame_id, field_ids, roles) {
 
     if (validateRoles(roles)) {
@@ -207,6 +217,11 @@ function addArgument(frame_id, field_ids, roles) {
             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;
+        
+        for(i = 0; i < field_ids.length; i++) {
+            connected_reverse[field_ids[i]].append('frame_' + frame_id + '_');
+        }
+        
         var complement_id = free_complement_id;
         free_complement_id = free_complement_id - 1;
 
diff --git a/semantics/static/js/semantics_view.js b/semantics/static/js/semantics_view.js
index cc8d11d..9407866 100644
--- a/semantics/static/js/semantics_view.js
+++ b/semantics/static/js/semantics_view.js
@@ -989,50 +989,55 @@ function schemaClick(class_id) {
             // highlighted_id = "26"
             var frame_id = parseInt(highlighted_id);
 
-            var choose_role = {
-                    state0: {
-                        title: 'Wybierz rolę',
-                        html: roles_display_table,
-                        buttons: { Anuluj: -1, Zatwierdź: 1 },
-                        focus: 1,
-                        close: function(){return result;},
-                        submit: function(e,v,m,f){ 
-                        
-                            if (v == -1) {
-                                e.preventDefault();
-                                $.prompt.close();
-                            }
-                            if (v == 1) {
-                                e.preventDefault();
-                                
-                                var roles = normalizeFormData(f.roles);
-
-                                var frame_id = parseInt(highlighted_id);
-                                var complement_id = addArgument(frame_id, field_ids, roles);
-                                
-                                if (complement_id) {
-                                    var h = "frame_" + highlighted_id + "_";
-                                    var a = "frame_" + highlighted_id + "_comp_" + complement_id + "_";
+            if (roleFree(frame_id, field_ids)) {
+
+                var choose_role = {
+                        state0: {
+                            title: 'Wybierz rolę',
+                            html: roles_display_table,
+                            buttons: { Anuluj: -1, Zatwierdź: 1 },
+                            focus: 1,
+                            close: function(){return result;},
+                            submit: function(e,v,m,f){ 
+                            
+                                if (v == -1) {
+                                    e.preventDefault();
+                                    $.prompt.close();
+                                }
+                                if (v == 1) {
+                                    e.preventDefault();
                                     
-                                    // re-draw and re-color frame
-                                    frameClick(h);
-                                    displayFrames();
-                                    frameClick(a);
+                                    var roles = normalizeFormData(f.roles);
+
+                                    // var frame_id = parseInt(highlighted_id);
+                                    var complement_id = addArgument(frame_id, field_ids, roles);
                                     
-                                    result = true;
-                                    $.prompt.close();
-                                } else {
-                                    alert("Wybrano niepoprawne role!");
+                                    if (complement_id) {
+                                        var h = "frame_" + highlighted_id + "_";
+                                        var a = "frame_" + highlighted_id + "_comp_" + complement_id + "_";
+                                        
+                                        // re-draw and re-color frame
+                                        frameClick(h);
+                                        displayFrames();
+                                        frameClick(a);
+                                        
+                                        result = true;
+                                        $.prompt.close();
+                                    } else {
+                                        alert("Wybrano niepoprawne role!");
+                                    }
                                 }
+                                
                             }
-                            
-                        }
-                    },
-                };
-            if (change == true) {
-                alertSemantics();
+                        },
+                    };
+                if (change == true) {
+                    alertSemantics();
+                } else {
+                    $.prompt(choose_role);
+                }
             } else {
-                $.prompt(choose_role);
+                alert("Nie można ponownie podłączyć tej samej pozycji składniowej");
             }
             
         }
@@ -1046,21 +1051,42 @@ function schemaClick(class_id) {
             } else {
                 // arg = "frame_26_comp_36_"
                 var i, j;
+                var can_connect = true;
+                if (roleFree(frame_id, field_ids)) {
+                    can_connect = false;
+                }
+                var connect = true;
                 for (i = 0; i < field_ids.length; i++) {
-                    if ((j = connected[arg].indexOf(field_ids[i])) != -1) {
-                        // disconnect
-                        connected[arg].splice(j, 1);
-                        frames_operations.push({operation: 'disconnect', arg: arg, connect: field_ids[i]});
-                        var a = arg;
-                        frameClick("");
-                        frameClick(a);
-                    } else {
-                        //connect
-                        connected[arg].push(field_ids[i]);
-                        frames_operations.push({operation: 'connect', arg: arg, connect: field_ids[i]});
-                        var a = arg;
-                        frameClick("");
-                        frameClick(a);
+                    if (connected[arg].indexOf(field_ids[i]) != -1) {
+                    connect = false;
+                    break;
+                    }
+                }
+                if (connect && !can_connect) {
+                    alert("Nie można ponownie podłączyć tej samej pozycji składniowej");
+                } else {
+                    for (i = 0; i < field_ids.length; i++) {
+                        if (!connect) {
+                            // disconnect
+                            j = connected[arg].indexOf(field_ids[i])
+                            if (j != -1) {
+                                connected[arg].splice(j, 1);
+                                frames_operations.push({operation: 'disconnect', arg: arg, connect: field_ids[i]});
+                                var a = arg;
+                                frameClick("");
+                                frameClick(a);
+                            }
+                        } else {
+                            //connect
+                            j = connected[arg].indexOf(field_ids[i])
+                            if (j == -1) { // redundant
+                                connected[arg].push(field_ids[i]);
+                                frames_operations.push({operation: 'connect', arg: arg, connect: field_ids[i]});
+                                var a = arg;
+                                frameClick("");
+                                frameClick(a);
+                            }
+                        }
                     }
                 } 
             } 
diff --git a/semantics/templates/semantics.html b/semantics/templates/semantics.html
index 61ca5a0..30b386e 100644
--- a/semantics/templates/semantics.html
+++ b/semantics/templates/semantics.html
@@ -39,7 +39,7 @@
             $.getJSON(ajax_frames, {lemma_id: {{ lemma.id }}}, function(data){
                 getFrames(data.frames_display);
                 displayFrames();
-                memorizeConnections(data.connections.connected, data.connections.disconnected);
+                memorizeConnections(data.connections.connected, data.connections.connected_reverse);
                 alternationCounts(data.alternations);
                 $("#semantic-frames-count").empty();
       			$("#semantic-frames-count").append(data.frames_count);
diff --git a/semantics/views.py b/semantics/views.py
index 8258a6e..e4aae64 100644
--- a/semantics/views.py
+++ b/semantics/views.py
@@ -166,9 +166,6 @@ def ajax_frames(request, lemma_id):
             display = {"roles": frame_roles, "preferences": frame_preferences}
             frame_display["frames"].append({"frame_id": str(frame.id), "colspan": str(max(len(frame_roles), 1)), "rowspan": str(frame_preferences_rowspan), "status": u'pewna', "display": display})
             
-            
-            arguments_frame_connected[frame.id] = []
-            
             for complement, complement_class in zip(frame_complements, frame_ids):
                 if complement_class not in complement_arguments:
                     complement_arguments[complement_class] = []
@@ -180,7 +177,9 @@ def ajax_frames(request, lemma_id):
                     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[complement_class].append(realization_id)
-                    arguments_frame_connected[frame.id].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:
@@ -189,16 +188,12 @@ def ajax_frames(request, lemma_id):
         
 
         frames_display.append(frame_display)
-    
-    arguments_not_connected = {}
-    # for complement_class in complement_arguments:
-    #     arguments_not_connected[complement_class] = list(all_schema_classes.difference(arguments_frame_connected[int(complement_class.split('_')[1])]))
 
     # ala["ma"] = "kot"
 
     context = {
                'frames_display': frames_display, 
-               'connections': {'connected': complement_arguments, 'disconnected': arguments_not_connected},
+               'connections': {'connected': complement_arguments, 'connected_reverse': arguments_frame_connected},
                'frames_count': lemma.entry_obj.actual_frames().count(),
                'alternations': alternations
               }
--
libgit2 0.22.2