From 77b03335c43b2beaf77ca1f5d752cec002e6e41e Mon Sep 17 00:00:00 2001
From: dcz <dcz@ipipan.waw.pl>
Date: Tue, 12 Jul 2022 13:53:57 +0200
Subject: [PATCH] Styles for unified frame. First attempt for Vue
 implementation of entries.js frame visualization.

---
 .../js/components/LexicalUnitDisplay.js       |  23 ++-
 .../entries/js/components/LexicalUnitEdit.js  |  90 ++++++-----
 .../components/SemanticsSchemataComponent.js  | 150 ++++++++++++++++++
 entries/templates/unification.html            |   1 +
 4 files changed, 219 insertions(+), 45 deletions(-)
 create mode 100644 entries/static/entries/js/components/SemanticsSchemataComponent.js

diff --git a/entries/static/entries/js/components/LexicalUnitDisplay.js b/entries/static/entries/js/components/LexicalUnitDisplay.js
index f975605..183a810 100644
--- a/entries/static/entries/js/components/LexicalUnitDisplay.js
+++ b/entries/static/entries/js/components/LexicalUnitDisplay.js
@@ -1,13 +1,20 @@
 import Spinner from './Spinner.js';
+import SemanticsSchemataComponent from "./SemanticsSchemataComponent.js";
+
 
 export default {
-  components: { Spinner },
+  components: { Spinner, SemanticsSchemataComponent },
   props: {
     entryId: Number,
     lexicalUnitId: Number
   },
   data() {
-    return { frame: null, unifiedFrame: undefined, gettext: window.gettext, hasPermission: window.has_permission }
+    return { frame: null, unifiedFrame: undefined, gettext: window.gettext, hasPermission: window.has_permission,
+      subentries: null,
+      alternations: null,
+      realisation_phrases: null,
+      realisation_descriptions: null,
+    }
   },
   emits: ['refresh', 'refreshEntriesList'],
   methods: {
@@ -72,6 +79,10 @@ export default {
       get_entry(this.entryId, false, this.lexicalUnitId).then(entry => {
         this.frame = entry.frames[0];
         this.unifiedFrame = entry.unified_frame;
+        this.subentries = entry.subentries;
+        this.alternations = entry.alternations;
+        this.realisation_phrases = entry.realisation_phrases;
+        this.realisation_descriptions = entry.realisation_descriptions;
         setup_notes($('#lexical-unit-notes'), $('#lexical-unit-notes-template'), this.lexicalUnitId, 'meanings.LexicalUnit', this.setup_notes);
       });
     }
@@ -135,6 +146,14 @@ export default {
       <div id="lexical-unit-notes"></div>
     </div>
     <div class="col h-100 px-1 pt-0 pb-0 overflow-auto" id="semantics-schemata-pane">
+<!--      <semantics-schemata-component -->
+<!--        :subentries="subentries"-->
+<!--        :key="subentries"-->
+<!--        :frame="frame"-->
+<!--        :alternations="alternations"-->
+<!--        :realisation_phrases="realisation_phrases"-->
+<!--        :realisation_descriptions="realisation_descriptions"-->
+<!--      />-->
       <div id="semantics-schemata"></div>
     </div>
   `
diff --git a/entries/static/entries/js/components/LexicalUnitEdit.js b/entries/static/entries/js/components/LexicalUnitEdit.js
index f0442ee..9a130e2 100644
--- a/entries/static/entries/js/components/LexicalUnitEdit.js
+++ b/entries/static/entries/js/components/LexicalUnitEdit.js
@@ -816,26 +816,27 @@ Object.assign(LexicalUnitEdit, {
     changeShowVerifiedFrames (val) {
       this.showVerifiedFrames = val;
     },
+    getArgumentCSS(argument) {
+      return (argument.role ? argument.role.str + ' ' : '') + (argument == this.active_unified_frame_argument ? 'active' : '');
+    }
   },
   mounted() {
     this.changeStatusButtonTitleToDefault();
-    if(!this.readOnly) {
-      Split(['#semantics-frames-pane', '#semantics-schemata-pane'], {
-        sizes: [40, 60],
-        minSize: 400,
-        gutterSize: 4,
-        elementStyle: (dimension, size, gutterSize) => {
-          return {
-            'flex-basis': 'calc(' + size + '% - ' + gutterSize + 'px)'
-          }
-        },
-      });
-      Split(['#semantics-unified-frame-pane', '#semantics-slowal-frames-pane', '#examples'], {
-        sizes: [40, 40, 20],
-        direction: 'vertical',
-        gutterSize: 4,
-      });
-    }
+    Split(['#semantics-frames-pane', '#semantics-schemata-pane'], {
+      sizes: [40, 60],
+      minSize: 400,
+      gutterSize: 4,
+      elementStyle: (dimension, size, gutterSize) => {
+        return {
+          'flex-basis': 'calc(' + size + '% - ' + gutterSize + 'px)'
+        }
+      },
+    });
+    Split(['#semantics-unified-frame-pane', '#semantics-slowal-frames-pane', '#examples'], {
+      sizes: [40, 40, 20],
+      direction: 'vertical',
+      gutterSize: 4,
+    });
     if(this.unifiedFrameId) {
       this.loadFrame();
     }
@@ -864,34 +865,37 @@ Object.assign(LexicalUnitEdit, {
       <div align="center">
         <div align="left" style="display: table;">
           <div class="unifiedFrame mt-3" v-bind:data-frame_id="unified_frame.id" id="lexical-unit" v-html="unified_frame_title"></div>
-          <table v-if="unified_frame.id" id="unified-frame" class="m-0 table-borderless border border-secondary text-dark">
+          <table v-if="unified_frame.id" id="unified-frame" class="m-0 table-borderless border border-secondary text-dark frame active">
           <tbody>
             <tr>
               <th scope="row" class="py-2 px-1 text-secondary role-header">Role</th>
-              <td
-                class="argument py-2 px-1 border-top border-left border-secondary role-column"
-                :class="argument == active_unified_frame_argument && 'active'"
-                v-for="argument in unified_frame_arguments"
-                :key="argument.id"
-                @click="unifiedFrameArgumentSelected(argument)"
-                @mouseover="unifiedFrameArgumentHovered(argument)"
-                @mouseleave="unifiedFrameArgumentHovered(null)"
-              >
-                {{ argument.role_type }}
-                
-                <div
-                  v-if="argument.role"
-                >
-                  [{{ argument.role.str }}]
-                </div>
-                <div v-else>
-                  <ul class="ul-role">
-                    <li v-for="proposed_role in argument.proposed_roles">
-                      {{ proposed_role.str }}
-                    </li>
-                  </ul>
-                </div>
-              </td>
+              
+              <template v-for="argument in unified_frame_arguments">
+                  <td
+                    class="argument py-2 px-1 border-top border-left border-secondary role-column"
+                    :class="getArgumentCSS(argument)"
+                    @click="unifiedFrameArgumentSelected(argument)"
+                    @mouseover="unifiedFrameArgumentHovered(argument)"
+                    @mouseleave="unifiedFrameArgumentHovered(null)"
+                  >
+                    {{ argument.role_type }}
+                    
+                    <div
+                      v-if="argument.role"
+                    >
+                      [{{ argument.role.str }}]
+                    </div>
+                    <div v-else>
+                      <ul class="ul-role">
+                        <li v-for="proposed_role in argument.proposed_roles">
+                          {{ proposed_role.str }}
+                        </li>
+                      </ul>
+                    </div>
+                  </td>
+              </template>
+              
+              
             </tr>
             <tr>
               <th scope="row" class="py-0 px-1 text-secondary role-header">Selectional preferences</th>
@@ -1009,7 +1013,7 @@ Object.assign(LexicalUnitEdit, {
             </div>
           </div>
         </div>
-      <div v-if="!readOnly" class="col w-100 p-0 tab-pane overflow-auto" id="examples">
+      <div class="col w-100 p-0 tab-pane overflow-auto" id="examples">
             <table id="semantics-examples" class="table table-sm table-hover">
                 <thead>
                     <tr>
diff --git a/entries/static/entries/js/components/SemanticsSchemataComponent.js b/entries/static/entries/js/components/SemanticsSchemataComponent.js
new file mode 100644
index 0000000..6591d18
--- /dev/null
+++ b/entries/static/entries/js/components/SemanticsSchemataComponent.js
@@ -0,0 +1,150 @@
+
+export default {
+    props: {
+        subentries: Object,
+        frame: Object,
+        alternations: Object,
+        realisation_phrases: Object,
+        realisation_descriptions: Object,
+    },
+    data() {
+        return {
+            img_prefix: String
+        }
+    },
+    methods: {
+        getFunctions(position) {
+            const props_spans = [];
+            if (position.func.str !== '') {
+                props_spans.push({str: position.func.str, tooltip: position.func.desc});
+            }
+            if (position.control.str !== '') {
+                props_spans.push({str: position.control.str, tooltip: position.control.desc});
+            }
+            if (position.p_control.str !== '') {
+                props_spans.push({str: position.p_control.str, tooltip: position.p_control.desc});
+            }
+            return props_spans;
+        },
+        getSchemataPositionCnt(schema) {
+            return schema.positions.length;
+        },
+        getRealisationDescriptions(schema) {
+            const alternationDescList = [];
+            if(this.alternations) {
+                const curr_alternations = this.alternations[this.frame.id][schema.id];
+                const curr_realisation_descriptions = this.realisation_descriptions[this.frame.id][schema.id];
+                for (let i in curr_alternations) {
+                    alternationDescList.push(curr_realisation_descriptions[i]);
+                }
+            }
+            return '<i>' + alternationDescList + '</i>';
+        },
+        getRoleCss(schema, position) {
+            const roles = [];
+            if(this.alternations) {
+                const argumentIdSet = new Set();
+
+                const curr_alternations = this.alternations[this.frame.id][schema.id];
+                for (let i in curr_alternations) {
+                    const alternation = curr_alternations[i]
+
+                    for (var arg_id in alternation){
+                        const phrase_ids = alternation[arg_id];
+                        phrase_ids.forEach(phrase_id => {
+                            if (phrase_id.startsWith(position.id)) {
+                                argumentIdSet.add(arg_id);
+                            }
+                        });
+                    }
+                }
+
+                argumentIdSet.forEach(argumentId => {
+                    const argument = this.frame.arguments.find(arg => argumentId.endsWith(arg.argument_id));
+                    const role = argument.role;
+                    roles.push(role);
+                });
+
+            }
+            return roles;
+        },
+        getPositionPhrases(schema, position) {
+            const phrases = [];
+            if(this.alternations) {
+                const curr_alternations = this.alternations[this.frame.id][schema.id];
+                for (let i in curr_alternations) {
+                    const alternation = curr_alternations[i]
+
+                    for (var arg_id in alternation){
+                        const phrase_ids = alternation[arg_id];
+                        phrase_ids.forEach(phrase_id => {
+                            if (phrase_id.startsWith(position.id)) {
+                                phrases.push(curr_realisation_phrases[arg_id][i][phrase_id]);
+                            }
+                        });
+                    }
+                }
+            }
+            return phrases;
+        }
+
+    },
+    mounted () {
+        this.img_prefix = window.STATIC_URL;
+        console.log(this.subentries);
+    },
+    created () {
+      console.log(this.subentries);
+    },
+    template: `
+    <div>
+      <div class="subentry" v-for="subentry in subentries">
+          <div class="mb-1 sticky-top"><h5 class="bg-dark text-light p-1">{{subentry.str}}</h5></div>
+          <div class="schema mb-3" v-for="schema in subentry.schemata">
+              <table class="table m-0 table-borderless border border-secondary text-dark">
+                  <tbody>
+                      <tr class="opinion-row">
+                          <th scope="row" class="py-2 px-1 text-secondary" style="width: 3em;">Opinia</th>
+                          <td class="opinion-cell py-2 px-1" :colspan="getSchemataPositionCnt(schema)"><img
+                                  :src="img_prefix + 'entries/img/' + schema.opinion_key + '.svg'" width="12"
+                                  height="12" :alt="schema.opinion"> {{schema.opinion}}
+                          </td>
+                      </tr>
+                      
+                      <tr>
+                          <th scope="row" class="py-2 px-1 text-secondary">Funkcja</th>
+                          
+                          <td class="position py-2 px-1 border-top border-left border-secondary"
+                            v-for="position in schema.positions">
+                            <div v-for="f in getFunctions(position)" class="phrase px-1 py-2 " data-alternation="0" data-phrase_id="42-2-1"><span data-toggle="tooltip"
+                                                                                                              data-placement="bottom"
+                                                                                                              :title="f.tooltip">{{f.str}}</span>
+                            </div>
+                          </td>
+                          
+                      </tr>
+                      
+                      <tr class="realisation-description">
+                          <td class="px-1 py-2" :colspan="getSchemataPositionCnt(schema)" v-html="getRealisationDescriptions(schema)"></td>
+                      </tr>
+                      <tr class="phrase-types alt-0">
+                          <th scope="row" class="py-0 px-1 text-secondary">Typy fraz</th>
+                          <td v-for="position in schema.positions" class="px-0 py-0 border-top border-left border-secondary">
+                              <div v-for="phrase in position.phrases" class="phrase px-1 py-2"
+                                      :class="getRoleCss(schema, position)" 
+                                      data-alternation="0" data-phrase_id="45-8-7">
+                                      <span data-toggle="tooltip" data-placement="bottom" 
+                                      :title="phrase.desc">{{phrase.str}}</span>
+                              </div>
+                              <div v-for="phrase in getPositionPhrases(schema, position)" class="realisation-phrase px-1 py-2"><i>{{phrase}}</i></div>
+                          </td>
+                      </tr>
+                  </tbody>
+              </table>
+          </div>
+      </div>
+  </div>
+  `
+}
+
+
diff --git a/entries/templates/unification.html b/entries/templates/unification.html
index 9bf5d2f..af416ac 100644
--- a/entries/templates/unification.html
+++ b/entries/templates/unification.html
@@ -8,6 +8,7 @@
 {% block scripts %}
     {{ block.super }}
     <link rel="stylesheet" type="text/css" href="{% static 'entries/css/unification_frames.css' %}">
+    <link rel="stylesheet" type="text/css" href="{% static 'common/css/role_colours.css' %}">
     <script src="{% static 'entries/js/unification_entries_list.js' %}"></script>
     <script src="{% static 'entries/js/unification_frames_list.js' %}"></script>
     <script src="{% static 'entries/js/unification_entries_for_frames_list.js' %}"></script>
-- 
GitLab