From aae5f32fb5240716478e2ee5ea5497865dc6420c Mon Sep 17 00:00:00 2001 From: dcz <dcz@ipipan.waw.pl> Date: Tue, 12 Jul 2022 20:42:51 +0200 Subject: [PATCH] Second attempt for Vue implementation of entries.js frame visualization. --- .../static/entries/js/components/Entries.js | 40 +++---- .../js/components/LexicalUnitDisplay.js | 108 ++++++++++-------- .../entries/js/components/LexicalUnitEdit.js | 4 +- .../frame-components/ExamplesComponent.js | 47 ++++++++ .../SemanticsSchemataComponent.js | 4 - .../frame-components/SlowalFrameComponent.js | 71 ++++++++++++ entries/static/entries/js/entries.js | 12 +- 7 files changed, 210 insertions(+), 76 deletions(-) create mode 100644 entries/static/entries/js/components/frame-components/ExamplesComponent.js rename entries/static/entries/js/components/{ => frame-components}/SemanticsSchemataComponent.js (98%) create mode 100644 entries/static/entries/js/components/frame-components/SlowalFrameComponent.js diff --git a/entries/static/entries/js/components/Entries.js b/entries/static/entries/js/components/Entries.js index 8635a0c..bc04b05 100644 --- a/entries/static/entries/js/components/Entries.js +++ b/entries/static/entries/js/components/Entries.js @@ -38,12 +38,12 @@ export default { } }, }); - Split(['#right-pane', '#examples'], { - direction: 'vertical', - sizes: [75, 25], - gutterSize: 4, - minSize: 10, - }); + // Split(['#right-pane', '#examples'], { + // direction: 'vertical', + // sizes: [75, 25], + // gutterSize: 4, + // minSize: 10, + // }); }, template: ` <div id="entries-list" class="col h-100 w-100 px-0 overflow-hidden"> @@ -66,20 +66,20 @@ export default { :initialIsEdit="isEdit" @refresh-entries-list="refreshEntriesList" /> </div> - <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> - <th scope="col">{{ gettext("Przykład") }}<i id="examples-argument"></i><i id="examples-lu"></i><i id="examples-schema"></i></th> - <th scope="col">{{ gettext("Źródło") }}</th> - <th scope="col">{{ gettext("Opinia") }}</th> - </tr> - </thead> - <tbody id="semantics-examples-list"> - </tbody> - </table> - <p class="mx-1 my-1" id="semantics-no-examples">{{ gettext("Brak przykładów") }}</p> - </div> +<!-- <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>--> +<!-- <th scope="col">{{ gettext("Przykład") }}<i id="examples-argument"></i><i id="examples-lu"></i><i id="examples-schema"></i></th>--> +<!-- <th scope="col">{{ gettext("Źródło") }}</th>--> +<!-- <th scope="col">{{ gettext("Opinia") }}</th>--> +<!-- </tr>--> +<!-- </thead>--> +<!-- <tbody id="semantics-examples-list">--> +<!-- </tbody>--> +<!-- </table>--> +<!-- <p class="mx-1 my-1" id="semantics-no-examples">{{ gettext("Brak przykładów") }}</p>--> +<!-- </div>--> </div> </div> ` diff --git a/entries/static/entries/js/components/LexicalUnitDisplay.js b/entries/static/entries/js/components/LexicalUnitDisplay.js index 02c1805..56aad1d 100644 --- a/entries/static/entries/js/components/LexicalUnitDisplay.js +++ b/entries/static/entries/js/components/LexicalUnitDisplay.js @@ -1,9 +1,11 @@ import Spinner from './Spinner.js'; -import SemanticsSchemataComponent from "./SemanticsSchemataComponent.js"; +import SemanticsSchemataComponent from "./frame-components/SemanticsSchemataComponent.js"; +import ExamplesComponent from "./frame-components/ExamplesComponent.js"; +import SlowalFrameComponent from "./frame-components/SlowalFrameComponent.js"; export default { - components: { Spinner, SemanticsSchemataComponent }, + components: { Spinner, SemanticsSchemataComponent, ExamplesComponent, SlowalFrameComponent }, props: { entryId: Number, lexicalUnitId: Number @@ -14,6 +16,7 @@ export default { alternations: null, realisation_phrases: null, realisation_descriptions: null, + examples: null, } }, emits: ['refresh', 'refreshEntriesList'], @@ -83,15 +86,18 @@ export default { this.alternations = entry.alternations; this.realisation_phrases = entry.realisation_phrases; this.realisation_descriptions = entry.realisation_descriptions; + this.examples = entry.examples; setup_notes($('#lexical-unit-notes'), $('#lexical-unit-notes-template'), this.lexicalUnitId, 'meanings.LexicalUnit', this.setup_notes); }); } }, - - // created () { - // this.setup(); - // }, mounted () { + Split(['#main-frames-pane', '#vue-examples'], { + direction: 'vertical', + sizes: [75, 25], + gutterSize: 4, + minSize: 10 + }); Split(['#semantics-frames-pane', '#semantics-schemata-pane'], { sizes: [40, 60], gutterSize: 4, @@ -105,47 +111,52 @@ export default { this.setup(); }, template: ` - <div class="col h-100 px-1 pt-0 pb-2 overflow-auto" id="semantics-frames-pane"> - <spinner /> - <div id="semantics-frames"></div> - <div class="text-center mb-3"> - <div> - <a class="btn btn-sm btn-outline-dark mr-2" v-if="frame?.status === 'N'" @click="isLeksykograf() ? markAsInvalid() : markAsBad()">{{ !isLeksykograf() ? gettext('Zła') : gettext('Błędna') }}</a> - <a class="btn btn-sm btn-outline-dark mr-2" v-if="isReadyToGet() && unifiedFrame === null" @click="take">{{ gettext('Pobierz') }}</a> - <a - class="btn btn-sm btn-outline-dark mr-2" - v-if="isReadyToProcess()" - @click="goToEdit(this.unifiedFrame.pk, this.entryId, this.lexicalUnitId)" - > - {{ isLeksykograf() ? gettext('Obrabiaj') : gettext('Sprawdź') }} - </a> - <a - class="btn btn-sm btn-outline-dark mr-2" - v-if="frame?.status === 'S' && unifiedFrame?.status === 'S'" - @click="goToEdit(this.unifiedFrame.pk)" - > - {{ gettext('Obejrzyj') }} - </a> - <a - class="btn btn-sm btn-outline-dark mr-2" - v-if="(frame?.status === 'B' || frame?.status === 'C') && hasPermission('semantics.manage_invalid_lexical_units')" - @click="frame?.status === 'C' ? frame_confirm_as_not_matching_unified_frame() : confirmInvalid()" - > - {{ gettext('Potwierdź') }} - </a> - <a - class="btn btn-sm btn-outline-dark mr-2" - v-if="(frame?.status === 'B' || frame?.status === 'C') && hasPermission('semantics.manage_invalid_lexical_units')" - @click="frame?.status === 'C' ? frame_reject_as_not_matching_unified_frame() : rejectInvalid()" - > - {{ gettext('Odrzuć') }} - </a> + <div class="col w-100 p-0 h-100 overflow-auto" id="main-frames-pane" > + <div class="col h-100 px-1 pt-0 pb-2 overflow-auto" id="semantics-frames-pane"> + <spinner /> +<!-- <div id="semantics-frames"></div>--> + <div id="vue-semantics-frames" v-if="frame"> + <slowal-frame-component :frame="frame" :key="frame"/> </div> -<!-- <span v-if="unifiedFrame === null">{{ gettext('Brak ramy unifikacyjnej') }}</span>--> + + <div class="text-center mb-3"> + <div> + <a class="btn btn-sm btn-outline-dark mr-2" v-if="frame?.status === 'N'" @click="isLeksykograf() ? markAsInvalid() : markAsBad()">{{ !isLeksykograf() ? gettext('Zła') : gettext('Błędna') }}</a> + <a class="btn btn-sm btn-outline-dark mr-2" v-if="isReadyToGet() && unifiedFrame === null" @click="take">{{ gettext('Pobierz') }}</a> + <a + class="btn btn-sm btn-outline-dark mr-2" + v-if="isReadyToProcess()" + @click="goToEdit(this.unifiedFrame.pk, this.entryId, this.lexicalUnitId)" + > + {{ isLeksykograf() ? gettext('Obrabiaj') : gettext('Sprawdź') }} + </a> + <a + class="btn btn-sm btn-outline-dark mr-2" + v-if="frame?.status === 'S' && unifiedFrame?.status === 'S'" + @click="goToEdit(this.unifiedFrame.pk)" + > + {{ gettext('Obejrzyj') }} + </a> + <a + class="btn btn-sm btn-outline-dark mr-2" + v-if="(frame?.status === 'B' || frame?.status === 'C') && hasPermission('semantics.manage_invalid_lexical_units')" + @click="frame?.status === 'C' ? frame_confirm_as_not_matching_unified_frame() : confirmInvalid()" + > + {{ gettext('Potwierdź') }} + </a> + <a + class="btn btn-sm btn-outline-dark mr-2" + v-if="(frame?.status === 'B' || frame?.status === 'C') && hasPermission('semantics.manage_invalid_lexical_units')" + @click="frame?.status === 'C' ? frame_reject_as_not_matching_unified_frame() : rejectInvalid()" + > + {{ gettext('Odrzuć') }} + </a> + </div> + <!-- <span v-if="unifiedFrame === null">{{ gettext('Brak ramy unifikacyjnej') }}</span>--> + </div> + <div id="lexical-unit-notes"></div> </div> - <div id="lexical-unit-notes"></div> - </div> - <div class="col h-100 px-1 pt-0 pb-0 overflow-auto" id="semantics-schemata-pane"> + <div class="col h-100 px-1 pt-0 pb-0 overflow-auto" id="semantics-schemata-pane"> <!-- <semantics-schemata-component --> <!-- :subentries="subentries"--> <!-- :key="subentries"--> @@ -156,5 +167,12 @@ export default { <!-- />--> <div id="semantics-schemata"></div> </div> + </div> + <div class="col w-100 p-0 tab-pane overflow-auto" id="vue-examples"> + <examples-component + :examples="examples" + :key="examples" + /> + </div> ` } diff --git a/entries/static/entries/js/components/LexicalUnitEdit.js b/entries/static/entries/js/components/LexicalUnitEdit.js index 2c8c64c..26033a5 100644 --- a/entries/static/entries/js/components/LexicalUnitEdit.js +++ b/entries/static/entries/js/components/LexicalUnitEdit.js @@ -176,7 +176,9 @@ Object.assign(LexicalUnitEdit, { setup_notes($('#notes-component'), $('#lexical-unit-notes-template'), this.unified_frame.id, 'unifier.UnifiedFrame', this.setup_notes_unified_frame); }, setup_notes_slowal_frame () { - setup_notes($('#notes-component'), $('#lexical-unit-notes-template'), this.active_slowal_frame.id, 'semantics.Frame', this.setup_notes_slowal_frame); + if(this.active_slowal_frame) { + setup_notes($('#notes-component'), $('#lexical-unit-notes-template'), this.active_slowal_frame.id, 'semantics.Frame', this.setup_notes_slowal_frame); + } }, setup_notes_slowal_frame_with_title_and_body (title, body) { this.right_pane_tab = 'notes'; diff --git a/entries/static/entries/js/components/frame-components/ExamplesComponent.js b/entries/static/entries/js/components/frame-components/ExamplesComponent.js new file mode 100644 index 0000000..1a8f93f --- /dev/null +++ b/entries/static/entries/js/components/frame-components/ExamplesComponent.js @@ -0,0 +1,47 @@ + +export default { + props: { + examples: Object, + }, + data() { + return { + img_prefix: String + } + }, + methods: { + }, + mounted () { + this.img_prefix = window.STATIC_URL; + }, + template: ` + <table id="semantics-examples" class="table table-sm table-hover" style=""> + <thead> + <tr> + <th scope="col">Przykład<i id="examples-argument"></i><i id="examples-lu"></i><i id="examples-schema"></i> + </th> + <th scope="col">Źródło</th> + <th scope="col">Opinia</th> + </tr> + </thead> + <tbody id="semantics-examples-list"> + + <tr v-for="example in examples" class="example" data-example_id="345858"> + <td class="py-1">{{example.sentence}} + <span v-if="example.note" data-toggle="tooltip" + data-placement="bottom" + data-html="true" title="" + :data-original-title="'Komentarz: <i>'+ example.note +'</i>'"><img + :src="img_prefix + '/common/img/info.svg'" alt="info" width="14" + height="14"></span> + </td> + <td class="py-1">{{example.source}}</td> + <td class="py-1">{{example.opinion}}</td> + </tr> + + </tbody> + </table> + <p class="mx-1 my-1" id="semantics-no-examples" style="display: none;">Brak przykładów</p> + ` +} + + diff --git a/entries/static/entries/js/components/SemanticsSchemataComponent.js b/entries/static/entries/js/components/frame-components/SemanticsSchemataComponent.js similarity index 98% rename from entries/static/entries/js/components/SemanticsSchemataComponent.js rename to entries/static/entries/js/components/frame-components/SemanticsSchemataComponent.js index 6591d18..d8f74f3 100644 --- a/entries/static/entries/js/components/SemanticsSchemataComponent.js +++ b/entries/static/entries/js/components/frame-components/SemanticsSchemataComponent.js @@ -91,10 +91,6 @@ export default { }, mounted () { this.img_prefix = window.STATIC_URL; - console.log(this.subentries); - }, - created () { - console.log(this.subentries); }, template: ` <div> diff --git a/entries/static/entries/js/components/frame-components/SlowalFrameComponent.js b/entries/static/entries/js/components/frame-components/SlowalFrameComponent.js new file mode 100644 index 0000000..be52e31 --- /dev/null +++ b/entries/static/entries/js/components/frame-components/SlowalFrameComponent.js @@ -0,0 +1,71 @@ + +export default { + props: { + frame: Object, + }, + data() { + return { + img_prefix: String + } + }, + methods: { + getTitleHTML() { + const ret = window.lexical_units2dom(this.frame.lexical_units); + return ret; + }, + getOpinionHTML() { + return window.make_opinion_row(this.frame, this.frame.arguments.length, 3).outerHTML; + }, + getArguments() { + return this.frame.arguments; + } + }, + mounted () { + this.img_prefix = window.STATIC_URL; + }, + template: ` + <div class="frame mb-3 active" data-frame_id="52"> + <div class="frame mt-3" id="lexical-unit" v-html="getTitleHTML()"></div> + <table class="table m-0 table-borderless border border-secondary text-dark"> + <tbody> + <tr class="opinion-row" v-html="getOpinionHTML()"> + </tr> + <tr> + <th scope="row" class="py-2 px-1 text-secondary">Rola</th> + <template v-for="argument in frame.arguments"> + <td class="argument py-2 px-1 border-top border-left border-secondary" :class="argument.role" data-argument_id="52-129" + data-role="initiator">{{argument.str}} + </td> + </template> + </tr> + <tr> + <th scope="row" class="py-0 px-1 text-secondary">Preferencje selekcyjne</th> + <template v-for="argument in getArguments()"> + + <td class="preferences py-0 px-0 border-top border-left border-secondary" data-argument_id="104513-142252" data-role="condition"> + + <template v-if="argument.preferences.length > 0" v-for='preference in argument.preferences'> + <div + v-if="preference.url != null" + class="preference py-2 px-1 preference-bold" + > + <a class="synset-plwn" v-bind:href="preference.url" target="_blank">{{ preference.str }}</a> + </div> + <div v-else class="preference py-2 px-1 preference-bold">{{ preference.str }}</div> + <span v-if="preference.info" data-toggle="tooltip" + data-placement="bottom" + data-html="true" + :title="'definicja: <i>'+ preference.info +'</i>'"><img + :src="img_prefix + '/common/img/info.svg'" alt="info" width="14" + height="14"></span> + </template> + </td> + </template> + </tr> + </tbody> + </table> + </div> + ` +} + + diff --git a/entries/static/entries/js/entries.js b/entries/static/entries/js/entries.js index 72b3e2d..27be8a7 100644 --- a/entries/static/entries/js/entries.js +++ b/entries/static/entries/js/entries.js @@ -594,9 +594,9 @@ function unbind_frame_opinion_click(frame) { function select_frame(frame) { var frame_id = frame.data('frame_id'); - if(window.unificationLeftPaneApp && window.unificationLeftPaneApp.$refs.unificationRightPane) { - window.unificationLeftPaneApp.$refs.unificationRightPane.$refs.lexicalUnitEdit.slowalFrameSelected(frame_id); - } + // if(window.unificationLeftPaneApp && window.unificationLeftPaneApp.$refs.unificationRightPane) { + // window.unificationLeftPaneApp.$refs.unificationRightPane.$refs.lexicalUnitEdit.slowalFrameSelected(frame_id); + // } if ($('.frame.active').length > 0) { unselect_frame($('.frame.active')); } else { @@ -613,9 +613,9 @@ function select_frame(frame) { function unselect_frame(frame) { var frame_id = frame.data('frame_id'); - if(window.unificationLeftPaneApp && window.unificationLeftPaneApp.$refs.unificationRightPane) { - window.unificationLeftPaneApp.$refs.unificationRightPane.$refs.lexicalUnitEdit.slowalFrameSelected(frame_id); - } + // if(window.unificationLeftPaneApp && window.unificationLeftPaneApp.$refs.unificationRightPane) { + // window.unificationLeftPaneApp.$refs.unificationRightPane.$refs.lexicalUnitEdit.slowalFrameSelected(frame_id); + // } unbind_arguments_click(frame); unbind_lus_click(frame); unbind_frame_opinion_click(frame); -- GitLab