#77 [nouns] hide noun examples (accordion)

This commit is contained in:
Andrea Vos 2020-10-16 18:55:41 +02:00
parent 28a01fe98f
commit 6cfcb65643
3 changed files with 298 additions and 270 deletions

View File

@ -24,56 +24,59 @@
<T>nouns.personNouns.info</T>
<h4><T>nouns.examples</T>:</h4>
<section class="table-responsive">
<table class="table table-striped table-hover table-fixed-3">
<thead>
<tr>
<th class="text-nowrap">
<Icon v="mars"/>
<T>nouns.masculine</T>
</th>
<th class="text-nowrap">
<Icon v="venus"/>
<T>nouns.feminine</T>
</th>
<th class="text-nowrap">
<Icon v="neuter"/>
<T>nouns.personNouns.label</T>
</th>
</tr>
</thead>
<tbody>
<tr v-for="noun in personNouns" :key="noun.id">
<td>
<ul class="list-singular">
<li v-for="w in noun.masc">{{ w }}</li>
</ul>
<ul class="list-plural">
<li v-for="w in noun.mascPl">{{ w }}</li>
</ul>
</td>
<td>
<ul class="list-singular">
<li v-for="w in noun.fem">{{ w }}</li>
</ul>
<ul class="list-plural">
<li v-for="w in noun.femPl">{{ w }}</li>
</ul>
</td>
<td>
<ul class="list-singular">
<li v-for="w in noun.neutr">{{ w }}</li>
</ul>
<ul class="list-plural">
<li v-for="w in noun.neutrPl">{{ w }}</li>
</ul>
</td>
</tr>
</tbody>
</table>
</section>
<details class="border mb-3">
<summary class="bg-light p-3">
<h4 class="h5 d-inline"><T>nouns.examples</T></h4>
</summary>
<div class="border-top table-responsive">
<table class="table table-striped table-hover table-fixed-3">
<thead>
<tr>
<th class="text-nowrap">
<Icon v="mars"/>
<T>nouns.masculine</T>
</th>
<th class="text-nowrap">
<Icon v="venus"/>
<T>nouns.feminine</T>
</th>
<th class="text-nowrap">
<Icon v="neuter"/>
<T>nouns.personNouns.label</T>
</th>
</tr>
</thead>
<tbody>
<tr v-for="noun in personNouns" :key="noun.id">
<td>
<ul class="list-singular">
<li v-for="w in noun.masc">{{ w }}</li>
</ul>
<ul class="list-plural">
<li v-for="w in noun.mascPl">{{ w }}</li>
</ul>
</td>
<td>
<ul class="list-singular">
<li v-for="w in noun.fem">{{ w }}</li>
</ul>
<ul class="list-plural">
<li v-for="w in noun.femPl">{{ w }}</li>
</ul>
</td>
<td>
<ul class="list-singular">
<li v-for="w in noun.neutr">{{ w }}</li>
</ul>
<ul class="list-plural">
<li v-for="w in noun.neutrPl">{{ w }}</li>
</ul>
</td>
</tr>
</tbody>
</table>
</div>
</details>
<Separator icon="atom-alt"/>
@ -83,63 +86,66 @@
<T>nouns.dukajNouns.info</T>
<h4><T>nouns.examples</T>:</h4>
<section class="table-responsive">
<table class="table table-striped table-hover table-fixed-3">
<thead>
<tr>
<th class="text-nowrap">
<Icon v="mars"/>
<T>nouns.masculine</T>
</th>
<th class="text-nowrap">
<Icon v="venus"/>
<T>nouns.feminine</T>
</th>
<th class="text-nowrap">
<Icon v="neuter"/>
<T>nouns.dukajNouns.label</T>
</th>
</tr>
</thead>
<tbody>
<tr v-for="noun in dukajNouns" :key="noun.id">
<td>
<ul class="list-singular">
<li v-for="w in noun.masc">{{ w }}</li>
</ul>
<ul class="list-plural">
<li v-for="w in noun.mascPl">{{ w }}</li>
</ul>
</td>
<td>
<ul class="list-singular">
<li v-for="w in noun.fem">{{ w }}</li>
</ul>
<ul class="list-plural">
<li v-for="w in noun.femPl">{{ w }}</li>
</ul>
</td>
<td>
<ul class="list-singular">
<li v-for="w in noun.neutr">
<Declension :word="w" :template="dukajDeclension"/>
</li>
</ul>
<ul class="list-plural">
<li><Icon v="question-square"/></li>
<!--
<li v-for="w in noun.neutrPl">
<Declension :word="w" plural :singularOptions="noun.neutr" :template="dukajDeclension"/>
</li>
-->
</ul>
</td>
</tr>
</tbody>
</table>
</section>
<details class="border mb-3">
<summary class="bg-light p-3">
<h4 class="h5 d-inline"><T>nouns.examples</T></h4>
</summary>
<div class="border-top table-responsive">
<table class="table table-striped table-hover table-fixed-3">
<thead>
<tr>
<th class="text-nowrap">
<Icon v="mars"/>
<T>nouns.masculine</T>
</th>
<th class="text-nowrap">
<Icon v="venus"/>
<T>nouns.feminine</T>
</th>
<th class="text-nowrap">
<Icon v="neuter"/>
<T>nouns.dukajNouns.label</T>
</th>
</tr>
</thead>
<tbody>
<tr v-for="noun in dukajNouns" :key="noun.id">
<td>
<ul class="list-singular">
<li v-for="w in noun.masc">{{ w }}</li>
</ul>
<ul class="list-plural">
<li v-for="w in noun.mascPl">{{ w }}</li>
</ul>
</td>
<td>
<ul class="list-singular">
<li v-for="w in noun.fem">{{ w }}</li>
</ul>
<ul class="list-plural">
<li v-for="w in noun.femPl">{{ w }}</li>
</ul>
</td>
<td>
<ul class="list-singular">
<li v-for="w in noun.neutr">
<Declension :word="w" :template="dukajDeclension"/>
</li>
</ul>
<ul class="list-plural">
<li><Icon v="question-square"/></li>
<!--
<li v-for="w in noun.neutrPl">
<Declension :word="w" plural :singularOptions="noun.neutr" :template="dukajDeclension"/>
</li>
-->
</ul>
</td>
</tr>
</tbody>
</table>
</div>
</details>
<Separator icon="atom-alt"/>
@ -190,15 +196,20 @@
masc: 'austronauta', fem: 'austronautka', neutr: 'austronautu',
mascPl: 'austronauci', femPl: 'austronautki', neutrPl: 'austronauty',
}),
new Noun({
id: 'Europejczyk',
masc: 'Europejczyk', fem: 'Europejka', neutr: 'Europeju',
mascPl: 'Europejczycy', femPl: 'Europejki', neutrPl: 'Europejy',
}),
new Noun({
id: 'przyjaciel',
masc: 'przyjaciel', fem: 'przyjaciółka', neutr: 'przyjaciełu',
mascPl: 'przyjaciele', femPl: 'przyjaciółki', neutrPl: 'przyjacieły',
}),
new Noun({
id: 'Europejczyk',
masc: 'Europejczyk', fem: 'Europejka', neutr: 'Europeju',
mascPl: 'Europejczycy', femPl: 'Europejki', neutrPl: 'Europejy',
id: 'twórca',
masc: 'twórca', fem: 'twórczyni', neutr: 'twórcu',
mascPl: 'twórcy', femPl: 'twórczynie', neutrPl: 'twórcy',
}),
],
dukajDeclension: new NounDeclension({

View File

@ -165,8 +165,8 @@ nouns:
z wyszczególnieniem ich formy męskiej, żeńskiej i nijakiej.
Podane wzory odmiany są normatywne, na podstawie słów z tymi samymi końcówkami.
examples: 'Przykłady'
dictionary: 'Słownik neutratywów'
approved: 'wpisów zatwierdzonych'
pending: 'oczekuje na moderację'

View File

@ -13,167 +13,179 @@
<NounsExtra/>
<Loading :value="nounsRaw">
<section v-if="$admin()">
<div class="alert alert-info">
<strong>{{ nounsCountApproved() }}</strong> <T>nouns.approved</T>,
<strong>{{ nounsCountPending() }}</strong> <T>nouns.pending</T>.
</div>
</section>
<details class="border mb-3" ref="dictionary">
<summary class="bg-light p-3" @click="loadNouns">
<h4 class="h5 d-inline">
<Icon v="book"/>
<T>nouns.dictionary</T>
</h4>
</summary>
<div class="border-top">
<Loading :value="nounsRaw">
<section v-if="$admin()" class="px-3">
<div class="alert alert-info">
<strong>{{ nounsCountApproved() }}</strong> <T>nouns.approved</T>,
<strong>{{ nounsCountPending() }}</strong> <T>nouns.pending</T>.
</div>
</section>
<section class="sticky-top">
<div class="input-group mb-3 bg-white">
<div class="input-group-prepend">
<span class="input-group-text">
<Icon v="filter"/>
</span>
</div>
<input class="form-control border-primary" v-model="filter" :placeholder="$t('crud.filterLong')" ref="filter"/>
<div class="input-group-append" v-if="filter">
<button class="btn btn-outline-danger" @click="filter = ''; $refs.filter.focus()">
<Icon v="times"/>
</button>
</div>
<div class="input-group-append">
<button class="btn btn-outline-success" @click="$refs.form.$el.scrollIntoView()">
<Icon v="plus-circle"/>
<T>nouns.submit.action</T>
</button>
</div>
</div>
</section>
<section class="sticky-top">
<div class="input-group mb-3 bg-white">
<div class="input-group-prepend">
<span class="input-group-text">
<Icon v="filter"/>
</span>
</div>
<input class="form-control border-primary" v-model="filter" :placeholder="$t('crud.filterLong')" ref="filter"/>
<div class="input-group-append" v-if="filter">
<button class="btn btn-outline-danger" @click="filter = ''; $refs.filter.focus()">
<Icon v="times"/>
</button>
</div>
<div class="input-group-append">
<button class="btn btn-outline-success" @click="$refs.form.$el.scrollIntoView()">
<Icon v="plus-circle"/>
<T>nouns.submit.action</T>
</button>
</div>
</div>
</section>
<section class="table-responsive">
<table :class="'table table-striped table-hover table-fixed-' + ($admin() ? 4 : 3)">
<thead>
<tr>
<th class="text-nowrap">
<Icon v="mars"/>
<T>nouns.masculine</T>
</th>
<th class="text-nowrap">
<Icon v="venus"/>
<T>nouns.feminine</T>
</th>
<th class="text-nowrap">
<Icon v="neuter"/>
<T>nouns.neuter</T>
</th>
<th v-if="$admin()"></th>
</tr>
</thead>
<tbody>
<template v-if="visibleNouns().length">
<tr v-for="noun in visibleNouns()" :class="{'mark-left': !noun.approved}" :key="noun.id">
<td>
<ul class="list-singular">
<li v-for="w in noun.masc">{{ w }}</li>
</ul>
<ul class="list-plural">
<li v-for="w in noun.mascPl">{{ w }}</li>
</ul>
<section class="table-responsive">
<table :class="'table table-striped table-hover table-fixed-' + ($admin() ? 4 : 3)">
<thead>
<tr>
<th class="text-nowrap">
<Icon v="mars"/>
<T>nouns.masculine</T>
</th>
<th class="text-nowrap">
<Icon v="venus"/>
<T>nouns.feminine</T>
</th>
<th class="text-nowrap">
<Icon v="neuter"/>
<T>nouns.neuter</T>
</th>
<th v-if="$admin()"></th>
</tr>
</thead>
<tbody>
<template v-if="visibleNouns().length">
<tr v-for="noun in visibleNouns()" :class="{'mark-left': !noun.approved}" :key="noun.id">
<td>
<ul class="list-singular">
<li v-for="w in noun.masc">{{ w }}</li>
</ul>
<ul class="list-plural">
<li v-for="w in noun.mascPl">{{ w }}</li>
</ul>
<small v-if="noun.base && nouns[noun.base]">
<p><strong><T>nouns.edited</T>:</strong></p>
<ul class="list-singular">
<li v-for="w in nouns[noun.base].masc">{{ w }}</li>
</ul>
<ul class="list-plural">
<li v-for="w in nouns[noun.base].mascPl">{{ w }}</li>
</ul>
</small>
<small v-if="noun.base && nouns[noun.base]">
<p><strong><T>nouns.edited</T>:</strong></p>
<ul class="list-singular">
<li v-for="w in nouns[noun.base].masc">{{ w }}</li>
</ul>
<ul class="list-plural">
<li v-for="w in nouns[noun.base].mascPl">{{ w }}</li>
</ul>
</small>
<button v-if="!$admin()" class="btn btn-outline-primary btn-sm m-1 hover-show" @click="edit(noun)">
<Icon v="pen"/>
<T>nouns.edit</T>
</button>
</td>
<td>
<ul class="list-singular">
<li v-for="w in noun.fem">{{ w }}</li>
</ul>
<ul class="list-plural">
<li v-for="w in noun.femPl">{{ w }}</li>
</ul>
<small v-if="noun.base && nouns[noun.base]">
<p><strong><T>nouns.edited</T>:</strong></p>
<ul class="list-singular">
<li v-for="w in nouns[noun.base].fem">{{ w }}</li>
</ul>
<ul class="list-plural">
<li v-for="w in nouns[noun.base].femPl">{{ w }}</li>
</ul>
</small>
</td>
<td>
<ul class="list-singular">
<li v-for="w in noun.neutr">
<Declension :word="w"/>
</li>
</ul>
<ul class="list-plural">
<li v-for="w in noun.neutrPl">
<Declension :word="w" plural :singularOptions="noun.neutr"/>
</li>
</ul>
<small v-if="noun.base && nouns[noun.base]">
<p><strong><T>nouns.edited</T>:</strong></p>
<ul class="list-singular">
<li v-for="w in nouns[noun.base].neutr">{{ w }}</li>
</ul>
<ul class="list-plural">
<li v-for="w in nouns[noun.base].neutrPl">{{ w }}</li>
</ul>
</small>
</td>
<td v-if="$admin()">
<ul class="list-unstyled">
<li v-if="!noun.approved">
<button class="btn btn-success btn-sm m-1" @click="approve(noun)">
<Icon v="check"/>
<T>crud.approve</T>
</button>
</li>
<li v-else @click="hide(noun)">
<button class="btn btn-outline-secondary btn-sm m-1">
<Icon v="times"/>
<T>crud.hide</T>
</button>
</li>
<li>
<button class="btn btn-outline-danger btn-sm m-1" @click="remove(noun)">
<Icon v="trash"/>
<T>crud.remove</T>
</button>
</li>
<li>
<button class="btn btn-outline-primary btn-sm m-1" @click="edit(noun)">
<button v-if="!$admin()" class="btn btn-outline-primary btn-sm m-1 hover-show" @click="edit(noun)">
<Icon v="pen"/>
<T>crud.edit</T>
<T>nouns.edit</T>
</button>
</li>
</ul>
</td>
</tr>
</template>
<template v-else>
<tr>
<td :colspan="$admin() ? 4 : 3" class="text-center">
<Icon v="search"/>
<T>nouns.empty</T>
</td>
</tr>
</template>
</tbody>
</table>
</section>
</Loading>
</td>
<td>
<ul class="list-singular">
<li v-for="w in noun.fem">{{ w }}</li>
</ul>
<ul class="list-plural">
<li v-for="w in noun.femPl">{{ w }}</li>
</ul>
<Separator icon="plus"/>
<small v-if="noun.base && nouns[noun.base]">
<p><strong><T>nouns.edited</T>:</strong></p>
<ul class="list-singular">
<li v-for="w in nouns[noun.base].fem">{{ w }}</li>
</ul>
<ul class="list-plural">
<li v-for="w in nouns[noun.base].femPl">{{ w }}</li>
</ul>
</small>
</td>
<td>
<ul class="list-singular">
<li v-for="w in noun.neutr">
<Declension :word="w"/>
</li>
</ul>
<ul class="list-plural">
<li v-for="w in noun.neutrPl">
<Declension :word="w" plural :singularOptions="noun.neutr"/>
</li>
</ul>
<NounSubmitForm ref="form"/>
<small v-if="noun.base && nouns[noun.base]">
<p><strong><T>nouns.edited</T>:</strong></p>
<ul class="list-singular">
<li v-for="w in nouns[noun.base].neutr">{{ w }}</li>
</ul>
<ul class="list-plural">
<li v-for="w in nouns[noun.base].neutrPl">{{ w }}</li>
</ul>
</small>
</td>
<td v-if="$admin()">
<ul class="list-unstyled">
<li v-if="!noun.approved">
<button class="btn btn-success btn-sm m-1" @click="approve(noun)">
<Icon v="check"/>
<T>crud.approve</T>
</button>
</li>
<li v-else @click="hide(noun)">
<button class="btn btn-outline-secondary btn-sm m-1">
<Icon v="times"/>
<T>crud.hide</T>
</button>
</li>
<li>
<button class="btn btn-outline-danger btn-sm m-1" @click="remove(noun)">
<Icon v="trash"/>
<T>crud.remove</T>
</button>
</li>
<li>
<button class="btn btn-outline-primary btn-sm m-1" @click="edit(noun)">
<Icon v="pen"/>
<T>crud.edit</T>
</button>
</li>
</ul>
</td>
</tr>
</template>
<template v-else>
<tr>
<td :colspan="$admin() ? 4 : 3" class="text-center">
<Icon v="search"/>
<T>nouns.empty</T>
</td>
</tr>
</template>
</tbody>
</table>
</section>
<Separator icon="plus"/>
<div class="px-3">
<NounSubmitForm ref="form"/>
</div>
</Loading>
</div>
</details>
</div>
</template>
@ -193,9 +205,6 @@
},
mounted() {
if (process.client) {
this.$axios.$get(`/nouns/all`, { headers: this.$auth() }).then(data => {
this.nounsRaw = data;
});
if (window.location.hash) {
const anchor = decodeURIComponent(window.location.hash.substr(1));
this.$nextTick(_ => {
@ -204,10 +213,12 @@
$anchor.scrollIntoView();
} else {
this.filter = anchor;
this.$refs.filter.focus();
this.$refs.filter.scrollIntoView();
this.loadNouns();
this.$refs.dictionary.open = true;
this.$refs.dictionary.focus();
this.$refs.dictionary.scrollIntoView();
setTimeout(_ => {
this.$refs.filter.scrollIntoView();
this.$refs.dictionary.scrollIntoView();
}, 1000);
}
})
@ -215,6 +226,12 @@
}
},
methods: {
async loadNouns() {
if (this.nounsRaw !== undefined) {
return;
}
this.nounsRaw = await this.$axios.$get(`/nouns/all`, { headers: this.$auth() });
},
edit(noun) {
this.$refs.form.edit(noun);
},