From bcd1d890de632a457e5fe037386b2f8186bbd73b Mon Sep 17 00:00:00 2001
From: Kasia Krasnowska <kasia.krasnowska@gmail.com>
Date: Wed, 14 Jul 2021 17:14:06 +0200
Subject: [PATCH] =?UTF-8?q?added=20=E2=80=98show=20related=20entries?=
 =?UTF-8?q?=E2=80=99=20option?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 common/templates/base.html           |   2 +-
 entries/static/entries/js/entries.js |  37 +++--
 entries/templates/entries.html       |   8 +-
 entries/templates/entries_list.html  |   1 +
 entries/templates/entry_display.html |   2 +-
 entries/urls.py                      |   1 +
 entries/views.py                     |  64 ++++++---
 locale/en/LC_MESSAGES/django.mo      | Bin 32086 -> 33488 bytes
 locale/en/LC_MESSAGES/django.po      | 202 ++++++++++++++++-----------
 locale/en/LC_MESSAGES/djangojs.po    |  28 ++--
 10 files changed, 222 insertions(+), 123 deletions(-)

diff --git a/common/templates/base.html b/common/templates/base.html
index 0be482d..a24c611 100644
--- a/common/templates/base.html
+++ b/common/templates/base.html
@@ -36,7 +36,7 @@
 <div class="container-fluid h-100 d-flex flex-column p-0">
     
     <!--z-index 2 above sticky-top-->
-    <nav class="navbar navbar-expand-lg sticky-top navbar-dark bg-dark font-weight-bold p-2" style="z-index: 1022;">
+    <nav id="page-nav" class="navbar navbar-expand-lg sticky-top navbar-dark bg-dark font-weight-bold p-2" style="z-index: 1022;">
         <a class="navbar-brand" href="{% url 'dash' %}">Walenty [beta]</a>
 
         <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
diff --git a/entries/static/entries/js/entries.js b/entries/static/entries/js/entries.js
index 12e6857..417618a 100644
--- a/entries/static/entries/js/entries.js
+++ b/entries/static/entries/js/entries.js
@@ -784,12 +784,12 @@ function show_unmatched_examples() {
     }
 }
 
-function get_entry(entry_id) {
+function get_entry(entry_id, related) {
     check_import_status();
     clear_entry();
     show_entry_spinners();
     //var data = { 'forms' : serialize_forms($('#main-form')), 'entry' : entry_id };
-    var data = { 'entry' : entry_id };
+    var data = { 'entry' : entry_id, 'no_filters' : related };
     $.ajax({
         type     : 'post',
         url      : '/' + lang + '/entries/get_entry/',
@@ -860,6 +860,7 @@ function update_last_visited(last_visited) {
 }
 
 function bind_settings() {
+    activate_tooltips($('#page-nav'));
     $('#show-realisation-descriptions').change(function() {
         var val = $(this).prop('checked') === true;
         $.ajax({
@@ -879,6 +880,21 @@ function bind_settings() {
             }
         });
     });
+    $('#show-linked-entries').change(function() {
+        var val = $(this).prop('checked') === true;
+        $.ajax({
+            type     : 'post',
+            url      : '/' + lang + '/entries/change_show_linked_entries/',
+            dataType : 'json',
+            data     : {'val' : val},
+            success  : function(response) {
+                update_entries();
+            },
+            error: function(request, errorType, errorMessage) {
+                show_error(errorType + ' (' + errorMessage + ')');
+            }
+        });
+    });
 }
 
 function show_reals_desc() {
@@ -895,7 +911,7 @@ function get_show_reals_desc() {
     return $('#show-realisation-descriptions').prop('checked') === true;
 }
 
-function update_entries(entries) {
+function update_entries() {
     
     $('#entries-table').DataTable({
         // https://datatables.net/manual/tech-notes/3
@@ -913,8 +929,9 @@ function update_entries(entries) {
         // https://datatables.net/reference/option/dom
         dom: 'ftri',
         columns: [
-            { data: 'name' },
-            { data: 'status__key' },
+            { data: 'lemma' },
+            { data: 'status' },
+            { data: 'POS' },
         ],
         orderMulti: false,
         // show processing indicator when sorting etc.
@@ -931,21 +948,25 @@ function update_entries(entries) {
             },
             {
                 className: 'p-1',
-                targets: [0, 1],
+                targets: [0, 1, 2],
             },
             // make only the lemma searchable
             {
                 searchable: false,
-                targets: 1,
+                targets: [1, 2]
              }
         ],
         createdRow: function(row, data, dataIndex, cells) {
             $(row).addClass('entry');
             $(row).attr('data-entry', data.id);
+            var related = data.related === true;
+            if (related) {
+                $(row).addClass('text-muted');
+            }
             $(row).click(function() {
                 var selected_entry = $(this).data('entry');
                 if (selected_entry !== curr_entry) {
-                    get_entry(selected_entry);
+                    get_entry(selected_entry, related);
                     $('.entry[data-entry="' + curr_entry + '"]').removeClass('table-primary');
                     $(this).addClass('table-primary');
                 }
diff --git a/entries/templates/entries.html b/entries/templates/entries.html
index 5e0efa5..0814f1f 100644
--- a/entries/templates/entries.html
+++ b/entries/templates/entries.html
@@ -63,7 +63,13 @@
         <div class="form-check custom-control custom-checkbox">
             <input type="checkbox" class="custom-control-input" id="show-realisation-descriptions"{% if request.session.show_reals_desc %} checked{% endif %}>
             <label class="custom-control-label" for="show-realisation-descriptions">
-            {% trans "Wyświetlaj opisy realizacji" %}
+            {% trans "Wyświetlaj opisy realizacji" %} <span data-toggle="tooltip" data-placement="bottom" title="{% trans "Po wybraniu ramy wyświetlaj opisy jej realizacji składniowych. Opisy (dla całej realizacji i dla poszczególnych fraz) są wyświetlane wewnątrz schematów." %}"><img src="/static/common/img/info.svg" alt="info" width="10" height="10"/></span>
+            </label>
+        </div>
+        <div class="form-check custom-control custom-checkbox">
+            <input type="checkbox" class="custom-control-input" id="show-linked-entries"{% if request.session.show_linked_entries %} checked{% endif %}>
+            <label class="custom-control-label" for="show-linked-entries">
+            {% trans "Wyświetlaj powiązane hasła" %} <span data-toggle="tooltip" data-placement="bottom" data-html="true" title="{% trans "Przy filtrowaniu haseł wyświetlaj, oprócz haseł spełniających kryteria filtrowania, hasła powiązane z nimi znaczeniowo (np. <i>podarować</i> – <i>podarunek</i> – <i>podarek</i>). Hasła powiązane niespełniające kryteriów filtrowania są wyróżnione jaśniejszym kolorem na liście oraz nie podlegają filtrowaniu schematów i ram (są zawsze wyświetlane w całości niezależnie od użytych filtrów dla schematów/ram)." %}"><img src="/static/common/img/info.svg" alt="info" width="10" height="10"/></span>
             </label>
         </div>
     </div>
diff --git a/entries/templates/entries_list.html b/entries/templates/entries_list.html
index 8828866..efd94e2 100644
--- a/entries/templates/entries_list.html
+++ b/entries/templates/entries_list.html
@@ -5,6 +5,7 @@
         <tr>
             <th class="p-1">{% trans "Lemat" %}</th>
             <th class="p-1">Status</th>
+            <th class="p-1">{% trans "Cz. mowy" %}</th>
         </tr>
     </thead>
     <tbody id="entries">
diff --git a/entries/templates/entry_display.html b/entries/templates/entry_display.html
index de2ad14..cf620b8 100644
--- a/entries/templates/entry_display.html
+++ b/entries/templates/entry_display.html
@@ -63,7 +63,7 @@
         </div>
     </div>
     <div class="col h-100 w-100 p-0 tab-pane" id="examples" role="tabpanel" aria-labelledby="examples-tab">
-        <table id="unmatched-examples" class="table table-sm table-hover table-responsive">
+        <table id="unmatched-examples" class="table table-sm table-hover">
             <thead>
                 <tr>
                     <th scope="col">{% trans "Przykład" %}</th>
diff --git a/entries/urls.py b/entries/urls.py
index 1a1a230..3c49764 100644
--- a/entries/urls.py
+++ b/entries/urls.py
@@ -13,6 +13,7 @@ urlpatterns = [
     path('get_entry/', views.get_entry, name='get_entry'),
     path('get_subform/', views.get_subform, name='get_subform'),
     path('change_show_reals_desc/', views.change_show_reals_desc, name='change_show_reals_desc'),
+    path('change_show_linked_entries/', views.change_show_linked_entries, name='change_show_linked_entries'),
     
     path('autocomplete/', autocompletes.autocomplete, name='autocomplete'),
     
diff --git a/entries/views.py b/entries/views.py
index 2012399..18875ca 100644
--- a/entries/views.py
+++ b/entries/views.py
@@ -35,7 +35,7 @@ from .forms import (
     SynsetPreferenceFormFactory,
 )
 
-from .polish_strings import STATUS, SCHEMA_OPINION, FRAME_OPINION, EXAMPLE_SOURCE, EXAMPLE_OPINION, RELATION
+from .polish_strings import STATUS, POS, SCHEMA_OPINION, FRAME_OPINION, EXAMPLE_SOURCE, EXAMPLE_OPINION, RELATION
 
 from .phrase_descriptions.descriptions import position_prop_description
 
@@ -49,6 +49,10 @@ def entries(request):
     # TODO make this automatic by subclassing/configuring session object
     if 'last_visited' not in request.session:
         request.session['last_visited'] = []
+    if 'show_reals_desc' not in request.session:
+        request.session['show_reals_desc'] = True
+    if 'show_linked_entries' not in request.session:
+        request.session['show_linked_entries'] = True
     # TODO retrieve the form from the request session – keep forms between page refreshes,
     # keep search history, allow saving searches?
     # if so, don’t delete local forms on main form submit in send_form
@@ -337,26 +341,46 @@ def get_entries(request):
         # TODO restrictions for testing – remove!!!
         #entries = entries.annotate(nsub=Count('subentries')).filter(nsub__gt=1)
         #entries = entries.filter(subentries__schemata__opinion__key__in=('vul', 'col')).filter(status__key__in=('(S) gotowe', '(S) sprawdzone'))
+        #entries = entries.filter(subentries__schema_hooks__alternation=2)
         
         total = entries.count()
         if scroller_params['filter']:
             entries = entries.filter(name__startswith=scroller_params['filter'])
         filtered = entries.count()
+        
+        linked_ids = set()
+        if request.session['show_linked_entries']:
+            entries_linked = Entry.objects.filter(subentries__schema_hooks__argument_connections__schema_connections__subentry__entry__in=entries).distinct().exclude(id__in=entries)
+            entries = entries.union(entries_linked)
+            linked_ids = set(e.id for e in entries_linked)
+        
         i, j = scroller_params['start'], scroller_params['start'] + scroller_params['length']
         order_field, order_dir = scroller_params['order']
-        if order_field != 0 or order_dir != 'asc':
-            # ordering other than lemma ascending (database default)
-            order_field = 'name' if order_field == 0 else 'status__key'
-            if order_dir == 'desc':
-                order_field = '-' + order_field
-            entries = entries.order_by(order_field)
+        if order_field == 0:
+            order_field = 'name'
+        elif order_field == 1:
+            order_field = 'status__key'
+        elif order_field == 2:
+            order_field = 'pos__tag'
+        if order_dir == 'desc':
+            order_field = '-' + order_field
+        entries = entries.order_by(order_field)
         status_names = STATUS()
-        entries_list = list(entries.values('id', 'name', 'status__key'))
+        POS_names = POS()
+        entries_list = list(entries.values('id', 'name', 'status__key', 'pos__tag'))
         result = {
             'draw' : scroller_params['draw'],
             'recordsTotal': total,
             'recordsFiltered': filtered,
-            'data': [{'id' : e['id'], 'name' : e['name'], 'status__key' : status_names[e['status__key']]} for e in entries_list[i:j]],
+            'data': [
+                {
+                    'id'      : e['id'],
+                    'lemma'   : e['name'],
+                    'status'  : status_names[e['status__key']],
+                    'POS'     : POS_names[e['pos__tag']],
+                    'related' : e['id'] in linked_ids,
+                } for e in entries_list[i:j]
+            ],
         }
         return JsonResponse(result)
     return JsonResponse({})
@@ -659,7 +683,10 @@ def get_entry(request):
             # form should already be validated if it passed through send_form
             assert(not errors_dict)
             
-            filter_schemata, filter_frames = entry_form.cleaned_data['filter_schemata'], entry_form.cleaned_data['filter_frames']
+            # dont’ do schema/frame filtering for related entries
+            FILTERING_OK = not simplejson.loads(request.POST['no_filters'])
+            filter_schemata = FILTERING_OK and entry_form.cleaned_data['filter_schemata']
+            filter_frames = FILTERING_OK and entry_form.cleaned_data['filter_frames']
             if filter_schemata:
                 schema_forms = []
                 # e.g. entry has schema that satisfies X & entry has schema that satisfies Y
@@ -700,14 +727,14 @@ def get_entry(request):
             
             
             local_schema_form = None
-            if 'schema_form' in request.session:
+            if FILTERING_OK and 'schema_form' in request.session:
                 errors_dict = dict()
                 local_schema_form = collect_forms(request.session['schema_form'], errors_dict)
                 print(local_schema_form)
                 assert(not errors_dict)
             
             local_frame_form = None
-            if 'frame_form' in request.session:
+            if FILTERING_OK and 'frame_form' in request.session:
                 errors_dict = dict()
                 local_frame_form = collect_forms(request.session['frame_form'], errors_dict)
                 assert(not errors_dict)
@@ -736,10 +763,6 @@ def get_entry(request):
             frames = [frame2dict(frame, entry.lexical_units.all()) for frame in frame_objects]
             alternations, realisation_phrases, realisation_descriptions = get_alternations(all_schema_objects, frame_objects)
             examples = get_examples(entry)
-            if 'last_visited' not in request.session:
-                request.session['last_visited'] = []
-            if 'show_reals_desc' not in request.session:
-                request.session['show_reals_desc'] = True
             # https://docs.djangoproject.com/en/2.2/topics/http/sessions/#when-sessions-are-saved
             if [entry.name, entry.id] in request.session['last_visited']:
                 request.session['last_visited'].remove([entry.name, entry.id])
@@ -779,3 +802,12 @@ def change_show_reals_desc(request):
         request.session['show_reals_desc'] = val
         return JsonResponse({ 'success' : 1 })
     return JsonResponse({})
+
+@ajax_required
+def change_show_linked_entries(request):
+    if request.method == 'POST':
+        val = simplejson.loads(request.POST['val'])
+        request.session['show_linked_entries'] = val
+        return JsonResponse({ 'success' : 1 })
+    return JsonResponse({})
+
diff --git a/locale/en/LC_MESSAGES/django.mo b/locale/en/LC_MESSAGES/django.mo
index e25e72102e413eb22e0c3b3afd4ec2b13f5d4f93..63b3175bf7c12ea66fc505d606cae8959df2877b 100644
GIT binary patch
delta 11623
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

delta 10260
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

diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po
index c890dc3..020256e 100644
--- a/locale/en/LC_MESSAGES/django.po
+++ b/locale/en/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-07-07 12:20+0200\n"
+"POT-Creation-Date: 2021-07-14 16:24+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -105,12 +105,12 @@ msgid "Status / część mowy"
 msgstr "Status / part of speech"
 
 #: dictionary_statistics/templates/dictionary_statistics.html:43
-#: entries/forms.py:201
+#: entries/forms.py:202
 msgid "Liczba schematów"
 msgstr "Number of schemata"
 
 #: dictionary_statistics/templates/dictionary_statistics.html:67
-#: entries/forms.py:205
+#: entries/forms.py:206
 msgid "Liczba ram"
 msgstr "Number of frames"
 
@@ -122,7 +122,7 @@ msgstr "all"
 msgid "Pobieranie"
 msgstr "Download"
 
-#: entries/autocompletes.py:27 entries/views.py:439
+#: entries/autocompletes.py:27 entries/views.py:464
 msgid "definicja:"
 msgstr "definition:"
 
@@ -186,11 +186,11 @@ msgstr "Invalid expression: %(msg)s."
 msgid "Typ frazy zleksykalizowanej"
 msgstr "Lexicalised phrase type"
 
-#: entries/form_fields/specialised_fields.py:44 entries/forms.py:546
+#: entries/form_fields/specialised_fields.py:44 entries/forms.py:549
 msgid "Typ frazy"
 msgstr "Phrase type"
 
-#: entries/form_fields/specialised_fields.py:51 entries/forms.py:634
+#: entries/form_fields/specialised_fields.py:51 entries/forms.py:637
 msgid "wybierz"
 msgstr "choose"
 
@@ -250,7 +250,7 @@ msgstr "Schema"
 msgid "Schemat(y) występujące w haśle"
 msgstr "Phrase type(s) occurring in the entry."
 
-#: entries/forms.py:147 entries/forms.py:419 entries/forms.py:640
+#: entries/forms.py:147 entries/forms.py:422 entries/forms.py:643
 msgid "Pozycja"
 msgstr "Position"
 
@@ -263,11 +263,14 @@ msgid ""
 "Pozycje mogą występować w różnych schematach. Aby ograniczyć filtrowanie do "
 "występowania wymaganych pozycji w obrębie jednego schematu, proszę użyć "
 "filtru POZYCJA wewnątrz filtra SCHEMAT powyżej."
-msgstr "Positions may occur in different schemata. In order to restrict filtering to positions co-occuring in one schema, use the POSITION filter inside SCHEMA filter above."
+msgstr ""
+"Positions may occur in different schemata. In order to restrict filtering to "
+"positions co-occuring in one schema, use the POSITION filter inside SCHEMA "
+"filter above."
 
-#: entries/forms.py:151 entries/forms.py:480 entries/forms.py:645
-#: entries/forms.py:764 entries/forms.py:766 entries/forms.py:768
-#: entries/forms.py:770
+#: entries/forms.py:151 entries/forms.py:483 entries/forms.py:648
+#: entries/forms.py:769 entries/forms.py:771 entries/forms.py:773
+#: entries/forms.py:775
 msgid "Fraza"
 msgstr "Phrase"
 
@@ -280,7 +283,10 @@ msgid ""
 "Frazy mogą występować w różnych schematach i na różnych pozycjach. Aby "
 "ograniczyć filtrowanie do występowania wymaganych fraz w obrębie jednej "
 "pozycji, proszę użyć filtru POZYCJA powyżej lub wewnątrz filtra SCHEMAT."
-msgstr "Phrases may occur in different schemata and on different positions. In order to restrict filtering to phrases co-occuring on one position, use the POSITION filter above or inside the SCHEMA filter."
+msgstr ""
+"Phrases may occur in different schemata and on different positions. In order "
+"to restrict filtering to phrases co-occuring on one position, use the "
+"POSITION filter above or inside the SCHEMA filter."
 
 #: entries/forms.py:164
 msgid "Rama"
@@ -290,242 +296,246 @@ msgstr "Frame"
 msgid "Rama/y występujące w haśle"
 msgstr "Frame(s) occurring in the entry."
 
-#: entries/forms.py:170
+#: entries/forms.py:165 entries/forms.py:600
+msgid "Argument"
+msgstr "Argument"
+
+#: entries/forms.py:165
+msgid "Argument(y) występujące w haśle"
+msgstr "Argument(s) occurring in the entry."
+
+#: entries/forms.py:171
 msgid "Własności hasła"
 msgstr "Entry properties"
 
-#: entries/forms.py:171
+#: entries/forms.py:172
 msgid "Własności składniowe"
 msgstr "Syntactic properties"
 
-#: entries/forms.py:172
+#: entries/forms.py:173
 msgid "Własności semantyczne"
 msgstr "Semantic properties"
 
-#: entries/forms.py:173 entries/forms.py:259
+#: entries/forms.py:174 entries/forms.py:262
 msgid "Filtruj"
 msgstr "Filter"
 
-#: entries/forms.py:174 entries/forms.py:260
+#: entries/forms.py:175 entries/forms.py:263
 msgid "Wyczyść"
 msgstr "Reset"
 
-#: entries/forms.py:180 entries/forms.py:496 entries/forms.py:502
-#: entries/forms.py:541 entries/templates/entries_list.html:6
+#: entries/forms.py:181 entries/forms.py:499 entries/forms.py:505
+#: entries/forms.py:544 entries/templates/entries_list.html:6
 msgid "Lemat"
 msgstr "Lemma"
 
-#: entries/forms.py:186
+#: entries/forms.py:187
 msgid "Część mowy"
 msgstr "Part of speech"
 
-#: entries/forms.py:212
+#: entries/forms.py:213
 msgid "Ukryj niepasujÄ…ce schematy"
 msgstr "Hide non-matching schemata"
 
-#: entries/forms.py:213
+#: entries/forms.py:214
 msgid "Ukryj niepasujÄ…ce ramy"
 msgstr "Hide non-matching frames"
 
-#: entries/forms.py:255
+#: entries/forms.py:258
 msgid "Zwiń"
 msgstr "Collapse"
 
-#: entries/forms.py:255
+#: entries/forms.py:258
 msgid "Usuń"
 msgstr "Remove"
 
-#: entries/forms.py:308 entries/forms.py:802
+#: entries/forms.py:311 entries/forms.py:807
 msgid "Zaneguj"
 msgstr "Negate"
 
-#: entries/forms.py:323
+#: entries/forms.py:326
 msgid "Schemat składniowy"
 msgstr "Syntactic schema"
 
-#: entries/forms.py:329
+#: entries/forms.py:332
 msgid "Opinia o schemacie"
 msgstr "Schema opinion"
 
-#: entries/forms.py:340
+#: entries/forms.py:343
 msgid "Typ"
 msgstr "Type"
 
-#: entries/forms.py:342
+#: entries/forms.py:345
 msgid "zwykły"
 msgstr "ordinary"
 
-#: entries/forms.py:343
+#: entries/forms.py:346
 msgid "frazeologiczny"
 msgstr "phraseological"
 
-#: entries/forms.py:352
+#: entries/forms.py:355
 msgid "Zwrotność"
 msgstr "Reflexiveness"
 
-#: entries/forms.py:363
+#: entries/forms.py:366
 msgid "Negatywność"
 msgstr "Negativity"
 
-#: entries/forms.py:374
+#: entries/forms.py:377
 msgid "Predykatywność"
 msgstr "Predicativity"
 
-#: entries/forms.py:385 entries/polish_strings.py:96
+#: entries/forms.py:388 entries/polish_strings.py:96
 msgid "Aspekt"
 msgstr "Aspect"
 
-#: entries/forms.py:404
+#: entries/forms.py:407
 msgid "Liczba pozycyj"
 msgstr "Number of positions"
 
-#: entries/forms.py:419
+#: entries/forms.py:422
 msgid "Pozycja/e występujące w schemacie"
 msgstr "Position(s) occurring in the entry."
 
-#: entries/forms.py:435
+#: entries/forms.py:438
 msgid "Pozycja składniowa"
 msgstr "Syntactic position"
 
-#: entries/forms.py:441
+#: entries/forms.py:444
 msgid "Funkcja gramatyczna"
 msgstr "Grammatical function"
 
-#: entries/forms.py:451
+#: entries/forms.py:454
 msgid "Kontrola"
 msgstr "Control"
 
-#: entries/forms.py:461
+#: entries/forms.py:464
 msgid "Kontrola predykatywna"
 msgstr "Predicative control"
 
-#: entries/forms.py:471
+#: entries/forms.py:474
 msgid "Liczba fraz"
 msgstr "Number of phrases"
 
-#: entries/forms.py:480
+#: entries/forms.py:483
 msgid "Fraza/y występujące na pozycji"
 msgstr "Phrase type(s) occurring on the position."
 
-#: entries/forms.py:516
+#: entries/forms.py:519
 msgid "Fraza zleksykalizowana"
 msgstr "Lexicalised phrase"
 
-#: entries/forms.py:522
+#: entries/forms.py:525
 msgid "Wybór lematów"
 msgstr "Lemma choice"
 
-#: entries/forms.py:532
+#: entries/forms.py:535
 msgid "Łączenie lematów"
 msgstr "Lemma joining"
 
-#: entries/forms.py:545 entries/forms.py:823
+#: entries/forms.py:548 entries/forms.py:828
 msgid "Typ składniowy frazy zleksykalizowanej."
 msgstr "Syntactic type of lexicalised phrase."
 
-#: entries/forms.py:568
+#: entries/forms.py:571
 msgid "Rama semantyczna"
 msgstr "Semantic frame"
 
-#: entries/forms.py:574 entries/templates/entry_display.html:37
+#: entries/forms.py:577 entries/templates/entry_display.html:37
 #: entries/templates/entry_display.html:56
 #: entries/templates/entry_display.html:71
 msgid "Opinia"
 msgstr "Opinion"
 
-#: entries/forms.py:584
+#: entries/forms.py:587
 msgid "Liczba argumentów"
 msgstr "Number of arguments"
 
-#: entries/forms.py:591
+#: entries/forms.py:594
 msgid "Liczba preferencyj selekcyjnych argumentu"
 msgstr "Number of argument’s selectional preferences"
 
-#: entries/forms.py:597
-msgid "Argument"
-msgstr "Argument"
-
-#: entries/forms.py:613
+#: entries/forms.py:616
 msgid "Argument semantyczny"
 msgstr "Semantic argument"
 
-#: entries/forms.py:619
+#: entries/forms.py:622
 msgid "Rola"
 msgstr "Role"
 
-#: entries/forms.py:626
+#: entries/forms.py:629
 msgid "Atrybut roli"
 msgstr "Role attribute"
 
-#: entries/forms.py:633 entries/forms.py:636
+#: entries/forms.py:636 entries/forms.py:639
 msgid "Preferencja selekcyjna"
 msgstr "Selectional preference"
 
-#: entries/forms.py:634
+#: entries/forms.py:637
 msgid "Predefiniowana grupa znaczeń"
 msgstr "Predefined meanings class"
 
-#: entries/forms.py:634
+#: entries/forms.py:637
 msgid "Wyrażona przez relację"
 msgstr "Expressed by relation"
 
-#: entries/forms.py:634
+#: entries/forms.py:637
 msgid "Wyrażona przez jednostkę leksykalną Słowosieci"
 msgstr "Expressed by plWordnet lexical unit"
 
-#: entries/forms.py:644
+#: entries/forms.py:647
 msgid "Typ frazy, przez którą może być realizowany argument."
 msgstr ""
 
-#: entries/forms.py:665
+#: entries/forms.py:670
 msgid "Preferencja predefiniowana"
 msgstr "Predefined preference"
 
-#: entries/forms.py:671
+#: entries/forms.py:676
 msgid "Predefiniowane"
 msgstr "Predefined"
 
-#: entries/forms.py:685
+#: entries/forms.py:690
 msgid "Preferencja – relacja"
 msgstr "Relational preference"
 
-#: entries/forms.py:691
+#: entries/forms.py:696
 msgid "Relacja"
 msgstr "Relation"
 
-#: entries/forms.py:702
+#: entries/forms.py:707
 msgid "Do: rola"
 msgstr "To: role"
 
-#: entries/forms.py:709
+#: entries/forms.py:714
 msgid "Do: atrybut"
 msgstr "To: attribute"
 
-#: entries/forms.py:721
+#: entries/forms.py:726
 msgid "Preferencja – Słowosieć"
 msgstr "plWordnet preference"
 
-#: entries/forms.py:727
+#: entries/forms.py:732
 msgid "Jednostka leksykalna"
 msgstr "Lexical unit"
 
-#: entries/forms.py:775
+#: entries/forms.py:780
 msgid "Fraza {}"
 msgstr "{} phrase"
 
-#: entries/forms.py:777 entries/phrase_descriptions/descriptions.py:124
+#: entries/forms.py:782 entries/phrase_descriptions/descriptions.py:124
 msgid "zleksykalizowana"
 msgstr "lexicalised"
 
-#: entries/forms.py:813
+#: entries/forms.py:818
 msgid "Realizacja składniowa frazy."
 msgstr "Syntactic realisation of the phrase."
 
-#: entries/forms.py:817
+#: entries/forms.py:822
 msgid "Fraza składowa zleksykalizowanej konstrukcji porównawczej."
 msgstr "Component phrase of lexicalised comparative construction."
 
-#: entries/forms.py:819
+#: entries/forms.py:824
 msgid "Fraza zleksykalizowana."
 msgstr "Lexicalised phrase."
 
@@ -2125,18 +2135,46 @@ msgstr "Options"
 msgid "Wyświetlaj opisy realizacji"
 msgstr "Show realisation descriptions"
 
-#: entries/templates/entries.html:97
+#: entries/templates/entries.html:66
+msgid ""
+"Po wybraniu ramy wyświetlaj opisy jej realizacji składniowych. Opisy (dla "
+"całej realizacji i dla poszczególnych fraz) są wyświetlane wewnątrz "
+"schematów."
+msgstr ""
+"When a frame is selected, show descriptions of its syntactic realisations. "
+"The descriptions (for whole realisation and for single phrases) are "
+"displayed inside schemata."
+
+#: entries/templates/entries.html:72
+msgid "Wyświetlaj powiązane hasła"
+msgstr "Show related entries"
+
+#: entries/templates/entries.html:72
+msgid ""
+"Przy filtrowaniu haseł wyświetlaj, oprócz haseł spełniających kryteria "
+"filtrowania, hasła powiązane z nimi znaczeniowo (np. <i>podarować</i> – "
+"<i>podarunek</i> – <i>podarek</i>). Hasła powiązane niespełniające kryteriów "
+"filtrowania są wyróżnione jaśniejszym kolorem na liście oraz nie podlegają "
+"filtrowaniu schematów i ram (są zawsze wyświetlane w całości niezależnie od "
+"użytych filtrów dla schematów/ram)."
+msgstr "When filtering entries, show (aside from entries satisfying filtering criteria) entries with related meanings, (eg. <i>podarować</i> – <i>podarunek</i> – <i>podarek</i>). Related entries that don’t satisfy filtering criteria are displayed in a lighter color on the entries list and are not subject to schema/frame filtering (ie. are always shown in their entirety regardless of schema/frame filters applied)."
+
+#: entries/templates/entries.html:103
 msgid "Filtrowanie haseł"
 msgstr "Entry filtering"
 
-#: entries/templates/entries.html:113
+#: entries/templates/entries.html:119
 msgid "Filtrowanie ram"
 msgstr "Frame filtering"
 
-#: entries/templates/entries.html:129
+#: entries/templates/entries.html:135
 msgid "Filtrowanie schematów"
 msgstr "Schema filtering"
 
+#: entries/templates/entries_list.html:8
+msgid "Cz. mowy"
+msgstr "PoS"
+
 #: entries/templates/entry_display.html:6
 msgid "Semantyka (ramy + schematy)"
 msgstr "Semantics (frames + schemata)"
@@ -2167,22 +2205,22 @@ msgstr "Source"
 msgid "Brak przykładów"
 msgstr "No examples"
 
-#: entries/views.py:427
+#: entries/views.py:452
 msgid ""
 "Realizacja tego argumentu w zdaniu powinna być powiązana jakąkolwiek relacją"
 msgstr "Realisation of this argument in the sentence should be in any relation"
 
-#: entries/views.py:429
+#: entries/views.py:454
 msgid ""
 "Realizacja tego argumentu w zdaniu powinna być powiązana relacją <i>{}</i>"
 msgstr ""
 "Realisation of this argument in the sentence should be in <i>{}</i> relation"
 
-#: entries/views.py:430
+#: entries/views.py:455
 msgid "z realizacjÄ… argumentu <i>{}</i>."
 msgstr "with realisation of the <i>{}</i> argument."
 
-#: entries/views.py:443
+#: entries/views.py:468
 msgid "hiperonimy:"
 msgstr "hypernyms"
 
diff --git a/locale/en/LC_MESSAGES/djangojs.po b/locale/en/LC_MESSAGES/djangojs.po
index 2af266d..43fea10 100644
--- a/locale/en/LC_MESSAGES/djangojs.po
+++ b/locale/en/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-07-07 12:20+0200\n"
+"POT-Creation-Date: 2021-07-14 16:24+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -139,40 +139,40 @@ msgid ""
 "Kliknij, aby wyświetlić argumenty i typy fraz powiązane z tym przykładem."
 msgstr "Click to show arguments and phrase types linked to this example."
 
-#: entries/static/entries/js/entries.js:960
+#: entries/static/entries/js/entries.js:981
 msgid "Przetwarzanie..."
 msgstr "Processing"
 
-#: entries/static/entries/js/entries.js:961
-#: entries/static/entries/js/entries.js:1018
+#: entries/static/entries/js/entries.js:982
+#: entries/static/entries/js/entries.js:1039
 msgid "Szukaj:"
 msgstr "Search:"
 
-#: entries/static/entries/js/entries.js:962
+#: entries/static/entries/js/entries.js:983
 msgid "Liczba haseł: _TOTAL_"
 msgstr "_TOTAL_ entries"
 
-#: entries/static/entries/js/entries.js:963
-#: entries/static/entries/js/entries.js:1019
+#: entries/static/entries/js/entries.js:984
+#: entries/static/entries/js/entries.js:1040
 msgid "Liczba haseł: 0"
 msgstr "0 entries"
 
-#: entries/static/entries/js/entries.js:964
+#: entries/static/entries/js/entries.js:985
 msgid "(spośród _MAX_)"
 msgstr "(out of _MAX_)"
 
-#: entries/static/entries/js/entries.js:965
-#: entries/static/entries/js/entries.js:1020
+#: entries/static/entries/js/entries.js:986
+#: entries/static/entries/js/entries.js:1041
 msgid "Brak haseł do wyświetlenia."
 msgstr "No entries to display."
 
-#: entries/static/entries/js/entries.js:967
-#: entries/static/entries/js/entries.js:1022
+#: entries/static/entries/js/entries.js:988
+#: entries/static/entries/js/entries.js:1043
 msgid ": sortuj kolumnÄ™ rosnÄ…co"
 msgstr ": sort column in ascending order"
 
-#: entries/static/entries/js/entries.js:968
-#: entries/static/entries/js/entries.js:1023
+#: entries/static/entries/js/entries.js:989
+#: entries/static/entries/js/entries.js:1044
 msgid ": sortuj kolumnÄ™ malejÄ…co"
 msgstr ": sort column in descending order"
 
-- 
GitLab