[names] #265 move names to db

This commit is contained in:
Avris 2021-09-25 14:55:53 +02:00
parent 94e9c18c79
commit de5307a01d
18 changed files with 629 additions and 192 deletions

38
components/DayMonth.vue Normal file
View File

@ -0,0 +1,38 @@
<template>
<div class="d-flex flex-grow-1">
<select v-model="month" class="form-select">
<option v-for="m in 12" :value="m"><T>calendar.months.{{m}}</T></option>
</select>
<select v-model="day" class="form-select">
<option v-for="d in 31" :value="d">{{d}}</option>
</select>
</div>
</template>
<script>
export default {
props: {
value: {required: true},
},
data() {
const [month, day] = this.value ? this.value.split('-') : ['1', '1'];
return {
month: parseInt(month),
day: parseInt(day),
}
},
watch: {
value() {
const [month, day] = this.value ? this.value.split('-') : ['1', '1'];
this.month = parseInt(month);
this.day = parseInt(day);
},
month() {
this.$emit('input', `${this.month.toString().padStart(2, '0')}-${this.day.toString().padStart(2, '0')}`)
},
day() {
this.$emit('input', `${this.month.toString().padStart(2, '0')}-${this.day.toString().padStart(2, '0')}`)
},
}
}
</script>

View File

@ -169,7 +169,7 @@
});
}
if (this.config.names.enabled) {
if (this.config.names && this.config.names.enabled && this.config.names.published) {
links.push({
link: '/' + this.config.names.route,
icon: 'signature',

92
components/Name.vue Normal file
View File

@ -0,0 +1,92 @@
<template>
<LazyHydrate when-visible>
<div>
<div class="d-flex justify-content-between">
<h3>{{ name.name }}</h3>
<slot></slot>
</div>
<div class="d-flex flex-column flex-md-row">
<ul class="list-unstyled w-md-50">
<li v-if="name.origin" class="mb-2">
<Icon v="map-marked-alt"/>
<strong><T>names.origin</T>:</strong>
{{ name.origin }}
</li>
<li v-if="name.meaning" class="mb-2">
<Icon v="comment-exclamation"/>
<strong><T>names.meaning</T>:</strong>
<LinkedText :text="name.meaning"/>
</li>
<li v-if="name.usage" class="mb-2">
<Icon v="user-friends"/>
<strong><T>names.usage</T>:</strong>
{{ name.usage }}
</li>
<li v-if="config.names.legally && name.legally" class="mb-2">
<Icon v="file-contract"/>
<strong><T>names.legally</T>:</strong>
{{ name.legally }}
</li>
<li v-if="config.names.count" class="mb-2">
<Icon v="users"/>
<strong><T>names.count</T>:</strong>
<NameCount :name="name.name"/>
</li>
<li v-if="config.names.namedays && name.namedays.length">
<Icon v="glass-cheers"/>
<strong><T>names.namedays</T>:</strong>
{{ namedaysString(name) }}
<p class="small" v-if="name.namedaysComment">(<LinkedText :text="name.namedaysComment"/>)</p>
</li>
</ul>
<ul class="list-unstyled w-md-50">
<li v-for="pro in name.pros" class="mb-2">
<Icon v="plus-circle"/>
<LinkedText :text="pro"/>
</li>
<li v-for="con in name.cons" class="mb-2">
<Icon v="minus-circle"/>
<LinkedText :text="con"/>
</li>
<li v-for="person in name.notablePeople" class="mb-2">
<Icon v="user"/>
<LinkedText :text="person"/>
</li>
<li v-for="link in name.links" class="mb-2">
<Icon v="external-link"/>
<a :href="link.trim()" target="_blank" rel="noopener">{{ clearUrl(link) }}</a>
</li>
</ul>
</div>
</div>
</LazyHydrate>
</template>
<script>
import {clearUrl} from '~/src/helpers';
import LazyHydrate from 'vue-lazy-hydration';
export default {
components: { LazyHydrate },
props: {
name: {required: true},
},
data() {
return {
clearUrl,
}
},
methods: {
namedaysString(name) {
if (!name.namedays.length) { return ''; }
const days = name.namedays.map(d => {
const [month, day] = d.split('-');
return this.$t('calendar.dates.' + parseInt(month), {day: parseInt(day)});
})
return days.join(', ')
},
},
}
</script>

View File

@ -0,0 +1,177 @@
<template>
<section v-if="$user()">
<div v-if="afterSubmit" class="alert alert-success text-center">
<p>
<T>nouns.submit.thanks</T>
</p>
<p>
<button class="btn btn-success" @click="afterSubmit = false">
<Icon v="plus"/>
<T>nouns.submit.another</T>
</button>
</p>
</div>
<form v-else @submit.prevent="submit">
<div class="row">
<div class="col-12 col-lg-6">
<div class="form-group">
<label><strong><T>names.name</T>:</strong></label>
<input v-model="form.name" class="form-control" required/>
</div>
<div class="form-group">
<label><strong><T>names.origin</T>:</strong></label>
<input v-model="form.origin" class="form-control"/>
</div>
<div class="form-group">
<label><strong><T>names.meaning</T>:</strong></label>
<input v-model="form.meaning" class="form-control"/>
</div>
<div class="form-group">
<label><strong><T>names.usage</T>:</strong></label>
<input v-model="form.usage" class="form-control"/>
</div>
<div class="form-group" v-if="config.names.legally">
<label><strong><T>names.legally</T>:</strong></label>
<input v-model="form.legally" class="form-control"/>
</div>
<template v-if="config.names.namedays">
<div class="form-group">
<label><strong><T>names.namedays</T>:</strong></label>
<ListInput v-model="form.namedays" v-slot="s">
<DayMonth v-model="s.val" @input="s.update(s.val)"/>
</ListInput>
<Debug :v="form.namedays"/>
</div>
<div class="form-group">
<label><strong><T>names.namedaysComment</T>:</strong></label>
<input v-model="form.namedaysComment" class="form-control"/>
</div>
</template>
</div>
<div class="col-12 col-lg-6">
<div class="form-group">
<label><strong><T>names.pros</T>:</strong></label>
<ListInput v-model="form.pros"/>
</div>
<div class="form-group">
<label><strong><T>names.cons</T>:</strong></label>
<ListInput v-model="form.cons"/>
</div>
<div class="form-group">
<label><strong><T>names.notablePeople</T>:</strong></label>
<ListInput v-model="form.notablePeople"/>
</div>
<div class="form-group">
<label><strong><T>names.links</T>:</strong></label>
<ListInput v-model="form.links" v-slot="s">
<input v-model="s.val" type="url" class="form-control" @keyup="s.update(s.val)" required/>
</ListInput>
</div>
</div>
</div>
<div class="alert alert-info" v-if="form.base">
<Icon v="info-circle"/>
<T>nouns.editing</T>
<button class="btn btn-sm float-end" @click="form.base = null">
<Icon v="times"/>
</button>
</div>
<button class="btn btn-primary w-100" :disabled="submitting">
<template v-if="submitting">
<Icon v="circle-notch fa-spin"/>
</template>
<template v-else>
<Icon v="plus"/>
<T>nouns.submit.actionLong</T>
</template>
</button>
<p class="small text-muted mt-1"><T>nouns.submit.moderation</T></p>
</form>
</section>
<section v-else class="text-center">
<div class="alert alert-info">
<T>crud.loginRequired</T>
</div>
</section>
</template>
<script>
export default {
data() {
return {
form: {
name: '',
origin: '',
meaning: '',
usage: '',
legally: '',
pros: [],
cons: [],
notablePeople: [],
links: [],
namedays: [],
namedaysComment: '',
base: null,
},
submitting: false,
afterSubmit: false,
}
},
methods: {
async submit() {
this.submitting = true;
try {
await this.$post(`/names/submit`, this.form);
this.afterSubmit = true;
this.form = {
name: '',
origin: '',
meaning: '',
usage: '',
legally: '',
pros: [],
cons: [],
notablePeople: [],
links: [],
namedays: [],
namedaysComment: '',
base: null,
};
} finally {
this.submitting = false;
}
},
edit(name) {
this.form = {
name: name.name,
origin: name.origin,
meaning: name.meaning,
usage: name.usage,
legally: name.legally,
pros: name.pros,
cons: name.cons,
notablePeople: name.notablePeople,
links: name.links,
namedays: name.namedays,
namedaysComment: name.namedaysComment,
base: name.id,
}
this.afterSubmit = false;
this.$el.scrollIntoView();
}
},
};
</script>

View File

@ -0,0 +1,5 @@
<template>
<ul v-if="config.links.names && config.links.names.length" class="list-unstyled">
<Link v-for="link in config.links.names" :link="link" :key="link.url"/>
</ul>
</template>

View File

@ -46,6 +46,7 @@
'terms',
'inclusive',
'census',
'names',
],
};
},

View File

@ -95,7 +95,6 @@
export default {
components: { LazyHydrate },
name: 'Source',
props: {
source: { required: true },
manage: { type: Boolean },

View File

@ -112,12 +112,14 @@ terminology:
route: 'terminologia'
names:
enabled: false
enabled: true
published: false
route: 'imiona'
legally: true
count: true
countSex: { M: 'mars', K: 'venus' }
countOrdinal: { 1: 'pierwsze imię', 2: 'drugie imię' }
namedays: true
faq:
enabled: true
@ -936,6 +938,34 @@ links:
url: 'http://dobrerzeczy.online/femaleSwitcher/'
headline: 'Female switcher'
extra: ' apka, która zamieni formy fleksyjne wyświetlanych tekstów z rodzaju męskiego na żeński.'
names:
-
icon: 'pen-nib'
url: '/blog/imiona-unisex-pesel'
headline: 'Imiona „unisex” w rejestrze PESEL'
quote: >
W zależności od tego, na którą metrykę spojrzymy, najbardziej uniseksowymi imionami uznawanymi przez urzędy są:
Maria głównie ze względu na tradycję nadawania tego imienia chłopcom na cześć Marii z Nazaretu,
Andrea - jeśli patrzymy tylko na pierwsze imiona,
Dominique z imponującym balansem 0.494, choć niezbyt popularne.
Najważniejszy wniosek jednak jest taki, że już teraz urzędy uznają całą masę imion za zgodne z ustawą niezależnie od płci metrykalnej 😉
-
icon: 'info-circle'
url: 'https://docs.google.com/document/d/1xkX0LE1EiwGqRyVFsMImmY2XnsO7f8jFUjUbUC77r6Y/edit'
headline: 'Poradnik, jak urzędowo zmienić imię w Polsce'
-
icon: 'newspaper'
url: 'https://wyborcza.pl/7,75410,26361697,prof-klosinska-dzban-to-slowo-nacechowane-pejoratywnie.html?disableRedirects=true'
headline: 'Prof. Katarzyna Kłosińska o neutralnych płciowo imionach'
quote: >
Od kilku lat coraz częściej dostajemy z urzędu stanu cywilnego prośby o opiniowanie imion neutralnych płciowo.
Najczęściej chodzi o nastolatki, których płeć biologiczna jest inna niż psychiczna,
są w trakcie procedury korekty płci lub nie identyfikują się ani jako kobieta, ani mężczyzna.
Chcą zmienić imię na takie, które nie będzie się kończyło ani na „a”, jak w polszczyźnie imiona kobiece,
ani na spółgłoskę, przypisaną imionom męskim.
Choć polska tradycja nie zna takich imion, to opiniujemy je pozytywnie,
bo w zderzeniu dwóch wartości: dobrostanu człowieka wynikającego z jego problemów z tożsamością i tradycji językowej,
należy uznać tę pierwszą za wyższą.
people:
enabled: false

View File

@ -1,96 +0,0 @@
name origin meaning usage legally cons pros notablePeople count links
Aba hebrajskie (m) {ojciec} żeńskie i męskie męskie M:14, K:5
Abi hebrajskie (k) - zdr. od Abigail radość ojca częściej żeńskie żeńskie może zostać uznane za zdrobnienie unisex końcówka M:2, K:9
Abia arabskie (k), farerskie (m) wielki (ar.) Skandynawia (m), kr. arabskie (k) unisex Abia Brown (m) M&K:0 https://www.nordicnames.de/wiki/Abia https://en.wikipedia.org/wiki/Abia_Brown
Abir arabskie (k), hebrajskie (m), bengalskie (m) zapach (ar.) Indie(m), kr. arabskie (k) unisex Abir Chatterjee (m), Abir Al-Sahlani (k) M:4, K:17 https://en.wikipedia.org/wiki/Abir_Al-Sahlani https://en.wikipedia.org/wiki/Abir_Chatterjee
Abe hebrajskie (m), zdr. od Abraham raczej męskie męskie może zostać uznane za zdrobnienie nijaka końcówka M:2, K:0 https://en.wikipedia.org/wiki/Abe_(given_name)
Adi hebrajskie, sanskryt klejnot (hebr.) unisex unisex może zostać uznane za zdrobnienie unisex końcówka Adi Ashkenazi (k), Adi Rocha (m) M:92. K: 257 https://en.wikipedia.org/wiki/Adi_(name)
Adiel hebrajskie (m) ozdoba Boga raczej męskie męskie końcówka Arielkowa M:5, K:0 https://en.wikipedia.org/wiki/Adiel
Adriel hebrajskie (m) raczej męskie męskie końcówka Arielkowa M:9, K:2
Aeron celtyckie wojna, królowa jasności unisex unisex Aeron Clement (m) M:2, K:0 https://pl.wikipedia.org/wiki/Aeron_(imi%C4%99) http://www.imiona.info/Aeron.html https://en.wikipedia.org/wiki/Aeron_Clement https://en.wikipedia.org/wiki/River_Aeron
Agam hebrajskie, hindi jezioro (hebr.) raczej męskie unisex Agam Darshi (k) M:5, K:18 https://www.babycenter.in/babyname/25050895/agam
Agi starogermańskie, greckie - zdr. od Agata, Agnes Chorwacja (m), Skandynawia (unisex), Węgry (k) unisex może zostać uznane za zdrobnienie unisex końcówka Agi Donath (k) M&K:0 https://www.behindthename.com/name/agi https://www.nordicnames.de/wiki/Agi_m https://www.nordicnames.de/wiki/Agi_f https://en.wikipedia.org/wiki/AGI
Alde wersja imienia Alda, germańskie Skandynawia(k) żeńskie nijaka końcówka M&K:0 https://www.nordicnames.de/wiki/Alde
Ale Skandynawia, języki romańskie (m) męskie może zostać uznane za zdrobnienie nijaka końcówka M:2, K:0 https://en.wikipedia.org/wiki/Ale_(disambiguation)
Aleks/Alex greckie obrończe ludu unisex żeńskie może zostać uznane za zdrobnienie, uznawane w PL za męskie Alex Wagner (k) Aleks: M:8245, K:4 Alex: M:8984, K:53 https://en.wikipedia.org/wiki/Alex_Wagner https://en.wikipedia.org/wiki/Alex#People_whose_first_name_is_Alex https://www.famousfix.com/list/celebrities-with-first-name-alex
Aleksandre greckie obrończe ludu Francja, Portugalia, Gruzja (m) męskie nijaka końcówka M:170, K:0
Alexis greckie obrończe ludu Kraje anglojęz. (uni), Grecja(m) unisex unisex końcówka Alexis Panselinos (m), Alexis Jordan (k) M:192, K:95 https://pl.wiktionary.org/wiki/Alexis https://en.wikipedia.org/wiki/Alexis_Panselinos https://en.wikipedia.org/wiki/Alexis_Jordan
Ali arabskie, ang. zdrobnienie licznych imion wysokie Kraje anglojęz. (uni), kr. arabskie(m) unisex może zostać uznane za zdrobnienie, kojarzone męsko unisex końcówka Ali Landry (k) M: 1723, K: 57 (gł. im. drugie) https://en.wikipedia.org/wiki/Ali_(name)#Given_name https://en.wikipedia.org/wiki/Ali_Landry
Alika arabskie, hawajskie, germańskie raczej żeskie unisex Alika DeRego (m) M: 14, K: 17 https://thesundevils.com/sports/baseball/roster/alika-williams/8712 https://en.wikipedia.org/wiki/Alika_DeRego
Aliki arabskie, hawajskie, germańskie raczej żeńskie unisex unisex końcówka M: 2, K: 23
Alix starofrancuskie lub greckie unisex, częściej żeńskie unisex unisex końcówka Alix Popham (m) M:2, K:27 https://en.wikipedia.org/wiki/Alix_(given_name)
Alo rdzennie amerykańskie przewodnicze duchowe męskie męskie nijaka końcówka M&K:0 https://www.names.org/n/alo/about https://themeaningofthename.com/alo/
Alte jidysz żeńskie i męskie żeńskie nijaka końcówka M&K:0 https://www.nordicnames.de/wiki/Alte https://www.kveller.com/jewish-baby-name/alte/
Alva germańskie, hebrajskie elf (ger.), jego wysokość (hebr.) unisex - Skandynawia (k), kr. anglojęz. (m) unisex Alva Mydral (k), Alva Duer (m) M:2, K:15 https://en.wikipedia.org/wiki/Alva_(given_name)
Alvard Armenia róża Armenia (k) żeńskie Alvard Petrossyan (k) M:0, K:33 https://en.wikipedia.org/wiki/Alvard_Petrossyan
Alvi farerskie elf, siła (far.) Skandynawia(uni), kraje arabskie i Azja Pd-Wsch(m) unisex unisex końcówka M:14, K:0 https://www.nordicnames.de/wiki/Alvi_m https://www.nordicnames.de/wiki/Alvi_f
Amare różne po łacinie znaczy kochać unisex unisex nijaka końcówka Amare Stoudemire (m) M:3:, K:0 https://nameberry.com/babyname/Amare https://pl.wikipedia.org/wiki/Amar%E2%80%99e_Stoudemire https://www.babynames.com/name/amare https://family.disney.com/baby-names/unisex-names/meaning-of-amare/ https://www.babynamespedia.com/meaning/Amare/f
Amari sanskryt, afrykańskie raczej męskie męskie unisex końcówka Amari Morgan-Smith (m) M&K:0 https://www.pampers.com/en-us/pregnancy/baby-names/find-your-baby-name/boys-names/amari https://en.wikipedia.org/wiki/Amari_Morgan-Smith https://nameberry.com/babyname/Amari/girl
Amel arabskie nadzieja unisex, kr. arabskie (k) unisex Amel Senan (k), Amel Tuka (m) M:11, K:62 https://en.wikipedia.org/wiki/Amel_(name)
Ami hebrajskie, indyjskie, japońskie nektar (ind), warte zaufania (hebr) unisex, Japonia (k) unisex unisex końcówka Ami Miron (m), Ami Trivedi (k) M:14, K: 12 https://en.wikipedia.org/wiki/Ami_(given_name)
Amparo Hiszpania schronienie żeńskie żeńskie nijaka końcówka M:0, K:6 https://pl.wikipedia.org/wiki/Amparo https://en.wikipedia.org/wiki/Amparo_(name)
Anael hebrajskie w żydowskiej tradycji imię archanioła unisex żeńskie kojarzy się z wiadomo czym Anael Lardy (k) M:0, K:4 https://www.kveller.com/jewish-baby-name/anael/ https://playback.fm/people/first-name/ana%C3%ABl https://www.behindthename.com/name/anael/submitted
Andi greckie, zdr. od Andrew/Andrea odważne, męskie unisex unisex unisex końcówka Andi Osho (k), Andy Allo (k) M:14, K:0; Andy: M:128, K:0 https://en.wikipedia.org/wiki/Andy_(given_name)
Andrea greckie, Włochy odważne, męskie Włochy, Albania (m), gdzie indziej raczej (k) unisex Andrea Bocelli (m) M:648, K: 1942 https://en.wikipedia.org/wiki/Andrea
Angel greckie {anielę}, {posłańcze} kraje anglojęz. (uni), kr. hiszpańskojęz. (m) unisex Angel Faith (k), Angel Rubio (m) M:379, K:66 https://en.wikipedia.org/wiki/Angel_(given_name)
Anri różne Japonia (unisex), Gruzja, Azerbejdżan (m) unisex unisex końcówka Anri Sala (m), Anri du Toit (ps.Yolandi Visser) (k) M:9, K:2 https://en.wikipedia.org/wiki/Anri_(given_name) https://en.wikipedia.org/wiki/Yolandi_Visser
Ante łacińskie Antoniusz, greckie Andreas Chorwacja, Szwecja, Litwa (m) męskie nijaka końcówka M:16, K:0 https://en.wikipedia.org/wiki/Ante_(name)
Apo finśkie zdrobnienia różnych imion Finlandia (unisex) unisex nijaka końcówka Apo Avedissian (m) M&K:0 https://www.babynamesdirect.com/boy/apo https://www.babynamesdirect.com/girl/apo https://www.nordicnames.de/wiki/Apo_m https://www.nordicnames.de/wiki/Apo_f https://en.wikipedia.org/wiki/Apo_Avedissian
Archie/Arczi germańskie, zdr. od Archibld raczej męskie unisex unisex końcówka Archie Panjabi (k) M: 32, K: 0 https://en.wikipedia.org/wiki/Archie_Panjabi https://en.wikipedia.org/wiki/Archie
Arda tureckie, armeńskie, staroangielskie berło (tur) Turcja (m), Armenia (k) unisex Arda Turan (m) M:55, K:0 https://en.wikipedia.org/wiki/Arda_(name)
Areli hebrajskie lew Boga raczej męskie męskie unisex końcówka M&K:0 https://www.babynames.com/name/areli https://www.behindthename.com/name/areli
Ari germańskie, greckie, hebrajskie orzeł (ger), szlachetne (gr), lew(hebr). m lub k w zależności od języka unisex może zostać uznane za zdrobnienie unisex końcówka Ari Meyers (k) M:104, K:4 https://en.wikipedia.org/wiki/Ari_(name)
Aria/Arja/Arya perskie, hebrajskie lwica (hebr., szlachetne (per), powietrze (wł), złoto (alb) Indie(m/k), Izrael(k), perski (m) unisex Aria Shahghasemi (m) Aria: M:15, K:120, Arja: M:2, K:9, Arya: M:10, K:39 https://en.wikipedia.org/wiki/Aria_(name) https://www.filmweb.pl/person/Aria+Shahghasemi-2592084
Ariel hebrajskie lew Boga unisex, dawniej męskie unisex końcówka Arielkowa Ariel Winter (k) M:6151, F: 76 https://en.wikipedia.org/wiki/Ariel_(name) https://en.wikipedia.org/wiki/Ariel_Winter
Aris greckie bóg Ares/szlachetne raczej męskie, Skandynawia (unisex) unisex nowogrecka męska końcówka zbieżna ze starogrecką żenską (por. Artemis, Eris) M:47:, F:2 https://www.nordicnames.de/wiki/Aris_f https://www.nordicnames.de/wiki/Aris_m https://en.wikipedia.org/wiki/Aris
Artemis greckie bogini Artemida raczej żeńskie, rzadziej męskie unisex końcowka unisex Artemis Fowl (m, fikcyjna) M:3, K:33 https://en.wiktionary.org/wiki/Artemis https://pl.wikipedia.org/wiki/Artemis_Fowl
Arti sanksryt żeńskie żeńskie może zostać uznane za zdrobnienie nijaka końcówka M:2, K:9 https://en.wikipedia.org/wiki/Arti_(given_name)
Arto celtyckie Finlandia (m) męskie może zostać uznane za zdrobnienie nijaka końcówka Arto Salomaa M:5, K:0 https://www.nordicnames.de/wiki/Arto https://www.behindthename.com/name/arto https://en.wikipedia.org/wiki/Arto_Salomaa
Asa hebrajskie, japońskie, afrykańskie unisex unisex Asa Briggs (m) M:5, K:2 https://en.wikipedia.org/wiki/Asa_(name)
Asel arabskie słodkie żeńskie żeńskie M:0, K:13 https://www.behindthename.com/name/asel
Assol/Asol rosyjskie żeńskie żeńskie Asol Sliwiec (k) M&K:0 https://pl.wikipedia.org/wiki/Assol_(imi%C4%99) https://pl.wikipedia.org/wiki/Asol_Sliwiec
Ata arabskie, tureckie prezent (ar), przodek (tur) męskie męskie Ata Demirer (m) M:27, K:4 https://en.wikipedia.org/wiki/Ata_(name)
Audre staroangielskie żeńskie żeńskie nijaka końcówka Audre, postać z Korony Królów (k), Audre Lorde (k) M&K:0 https://en.wikipedia.org/wiki/Audre_Lorde
Auge greckie (mitologia) promień słońca żeńskie, jeden z wariantów męskiego Auger (fr) żeńskie nijaka końcówka M&K:0 https://www.familyeducation.com/baby-names/name-meaning/auge
Aulani hawajskie posłańcze króla raczej żeńskie żeńskie nazywa się tak kurort Disneya na Hawajach unisex końcówka M&K:0 https://www.mynamestats.com/First-Names/A/AU/AULANI/index.html
Auri greckie, od Aura lub lacińskie, od Aurora bryza (gr), świt (łac) raczej żeńskie unisex unisex końcówka Auri Dias Faustino (m) M:0, K:3 https://www.nordicnames.de/wiki/Auri https://en.wikipedia.org/wiki/Auri_Dias_Faustino
Aurum łacina zloto unisex unisex końcówka nijaka M&K:0 https://www.babynames.com/name/aurum https://themeaningofthename.com/aurum/
Awo/Avo afrykańskie, grenlandzkie urodzone we wtorek (afr) unisex unisex końcówka nijaka M&K:0 https://www.name-doctor.com/name-awo-meaning-of-awo-42887.html https://www.nordicnames.de/wiki/Avo https://en.wikipedia.org/wiki/Avo_(name)
Aza kurdyjskie (m), starocerkiewnosłowiańskie (k), arabskie (ż) odważne, hero (kurd) męskie, ale np. w krajach afrykańskich i Rosji żeńskie unisex Aza, władca Manny (m, VIII/VII w p.n.e.) M:0, K:32 https://en.wikipedia.org/wiki/Aza https://charlies-names.com/en/aza/ https://en.wikipedia.org/wiki/Mannaeans
Basanta hindi wiosna męskie męskie Basanta Regmi (m) M: 8, K:0 http://www.namepedia.org/en/firstname/Basanta/ http://www.babynology.com/assamese-mcelebritybasanta.html
Bel romańskie piękne żeńskie żeńskie może zostać uznane za zdrobnienie Annabel "Bel" Linquist (k) M&K:0 https://en.wikipedia.org/wiki/Bel_(name) http://www.namepedia.org/en/firstname/Bel/
Bela węgierskie, romańskie serce (węg), czyste (cz) Węgry (m), Czechy (k) unisex może zostać uznane za zdrobnienie liczni władcy węgier (m), Běla Hlaváčková (k) M:18, K:50 https://en.wikipedia.org/wiki/B%C4%9Bla https://en.wikipedia.org/wiki/B%C3%A9la_(given_name)
Beni romańskie dobre Japonia (k), Albania (k), Europa (m) unisex może zostać uznane za zdrobnienie unisex końcówka Beni Takemata (k) M:14, K:0 https://en.wikipedia.org/wiki/Beni http://namepedia.org/en/firstname/Beni/ https://en.wikipedia.org/wiki/Beni_Takemata
Berni germańskie, greckie niedźwiedź (ger), przynoszące zwycięstwo (gr) Skandynawia (m), kraje anglosaskie (uni) unisex może zostać uznane za zdrobnienie unisex końcówka M&K:0 https://nameberry.com/babyname/Berni https://www.nordicnames.de/wiki/Berni http://www.thinkbabynames.com/meaning/0/Berni http://namepedia.org/en/firstname/Berni/
Berno germańskie niedźwiedź męskie męskie nijaka końcówka M:5, K:0 https://www.nordicnames.de/wiki/Berno https://en.wikipedia.org/wiki/Berno
Bessi farerskie, romańskie (jako wariant Beatrice) Skandynawia (m), kraje anglosaskie (k) unisex może zostać uznane za zdrobnienie unisex końcówka M&K:0 https://www.nordicnames.de/wiki/Bessi_m https://www.nordicnames.de/wiki/Bessi_f https://nameberry.com/babyname/Bessi
Biel hebrajskie (od Gabriel) raczej męskie męskie może zostać uznane za zdrobnienie końcówka Arielkowa Biel Medina (m) M:2, K:0 https://en.wikipedia.org/wiki/Biel_(name)
Billi/Billie/Billy/Billy staroangielskie unisex żeńskie może zostać uznane za zdrobnienie unisex końcówka Billy: M:25, K:3 Billie: M&K:0, Billi: M:2, K:0, Bili: M:0, K:2 https://charlies-names.com/en/billi/ http://www.thinkbabynames.com/meaning/0/Billi https://nameberry.com/babyname/Billi https://en.wikipedia.org/wiki/Billie
Bora greckie, koreańskie wiatr Boreasz Turcja (m), Korea (ż) unisex M:39, K:0 https://en.wikipedia.org/wiki/Bora_(Korean_name)
Bori od Barbara lub Borys unisex unisex może zostać uznane za zdrobnienie unisex końcówka M:2, K:0 http://www.namepedia.org/en/firstname/Bori_(296491)/ http://www.namepedia.org/en/firstname/Bori_(105874)/ https://www.babycenter.com/baby-names-bori-438485.htm
Boro od Barbara lub Borys Węgry (k), Chorwacja (m) unisex może zostać uznane za zdrobnienie nijaka końcówka M:2,K:0 http://www.namepedia.org/en/firstname/Bor%C3%B3/, https://en.wikipedia.org/wiki/Bora_(Turkish_name)
Bri celtyckie szlachetne raczej żeńskie żeńskie może zostać uznane za zdrobnienie unisex końcówka Brie Bella (k) M&K:0 http://www.thinkbabynames.com/meaning/0/Bri http://www.thinkbabynames.com/meaning/1/Bri
Bronwyn celtyckie jasna pierś raczej żeńskie, ale -wyn to męska walijska końcówka żeńskie M:0, K:6 https://en.wikipedia.org/wiki/Bronwynn
Bruni staronordyckie Dania (m) męskie unisex końcówka M&K:0 https://www.nordicnames.de/wiki/Bruni
Bryn/Brynn celtyckie wzgórze raczej żeńskie, ale unisex unisex Bryn Renner (m) M:5, K:0 https://nameberry.com/babyname/Bryn/girl https://nameberry.com/babyname/Bryn/boy
Cameron celtyckie unisex unisex Cameron Diaz (k), Cameron Boyce (m) M:86, K:9 https://en.wikipedia.org/wiki/Cameron_(given_name)
Carrigan celtyckie włócznia raczej żeńskie żeńskie często występuje jako nazwisko M&K:0 https://www.babynames.com/name/carrigan https://www.names.org/n/carrigan/about
Charlie angielskie unisex unisex w Polsce kojarzy się głównie męsko M:149, K:16 https://en.wikipedia.org/wiki/Charlie_(given_name)
Chris/Kris greckie głównie męskie, ale używane także żeńsko unisex w Polsce kojarzy się głównie męsko Chris Evert (k) Chris: M:186, K:0, Kris: M:84, K:0 https://en.wikipedia.org/wiki/Chris_Evert
Dali Islandia (m), Hiszpania (f), najczęściej żeńskie unisex unisex końcówka Dali Jazi (m), Dali(k, bogini gruzińska) M:2, K:16 https://en.wikipedia.org/wiki/Dali_Jazi https://pl.wikipedia.org/wiki/Dali_(mitologia)
Dani hebrajskie unisex unisex unisex końcówka M:45, K:4 https://en.wikipedia.org/wiki/Dani
Darien perskie unisex, częściej męskie unisex Darien Fenton (k), Darien Ferrer (m) M:4, K:0 https://en.wikipedia.org/wiki/Darien
Datuna hebrajskie gruzińskie zdrobnienie Dawid, męskie męskie Datuna Rakviashvili (m) M:12, K:0 https://en.wikipedia.org/wiki/Datuna
Dejno greckie mitologiczne, jedna z Forkid/Grai żeńskie nijaka końcowka M&K:0 https://pl.wikipedia.org/wiki/Forkidy
Del romańskie raczej męskie unisex Del Harisson (fk M&K:0 https://en.wikipedia.org/wiki/Del_(disambiguation)
Demi greckie od Demeter raczej żeńskie żeńskie unisex końcówka Demi Orimoloye (m) M:0, K:28 https://en.wikipedia.org/wiki/Demi https://en.wikipedia.org/wiki/Demi_Orimoloye
Deo łacińskie, hindu boskie raczej męskie męskie może zostać uznane za zdrobnienie nijaka końcówka Deo Simcox (m), M:4, K:0 https://www.familyeducation.com/baby-names/name-meaning/deo http://www.namepedia.org/en/firstname/Deo/ https://www.imdb.com/name/nm2351086/
Diamanto greckie diament raczej żeńskie unisex nijaka końcówka M&K:0 https://www.behindthename.com/name/diamanto https://en.wikipedia.org/wiki/Diamond_(given_name)
Dido greckie raczej żeńskie (Dido mitologiczna) żeńskie nijaka końcówka Dido Fontana (m), Dido Miles (k) M&K:0 https://en.wikipedia.org/wiki/Dido_(disambiguation)
Dima rosyjskie, arabskie męskie (ros.), żeńskie (ar.) unisex unisex końcówka M:25, K:18 https://www.babynames.com/name/dima https://www.nordicnames.de/wiki/Dima_f https://www.nordicnames.de/wiki/Dima_m
Dimi greckie od Demeter żeńskie (gr), męskie (ros.) unisex M&K:0 https://www.behindthename.com/name/dimi
Dori greckie prezent raczej męskie, ale też jako zdr. od Dorota unisex może zostać uznane za zdrobnienie unisex końcówka Dori Seda (k), Dori Arad (m) M:11, K:0 http://www.namepedia.org/en/firstname/Dori/ https://en.wikipedia.org/wiki/Dori
Dorin/Doreen greckie prezent kr. anglojęz. (k), Rumunia (m) unisex Dorin Tudoran (m) Dorin: M:87, K:6 (Doreen 26) http://www.namepedia.org/en/firstname/Dorin/ https://en.wikipedia.org/wiki/Doreen_(given_name) https://en.wikipedia.org/wiki/Dorin
Dorian greckie doryckie zwykle męskie, coraz częściej unisex męskie/unisex Dorian Gray(k), Dorian Electra (nb) M:8182, K:0 https://en.wikipedia.org/wiki/Dorian_(name) https://en.wikipedia.org/wiki/Dorian_Gray_(actress)
Doro greckie prezent Włochy, Serbia (m), kraje anglojęzyczne (k) unisex może zostać uznane za zdrobnienie nijaka końcówka Doro (k) M&K:0 http://www.namepedia.org/en/firstname/%C4%90oro/ https://pl.wikipedia.org/wiki/Doro
Duri koreańskie unisex unisex unisex końcówka M&K:0 https://en.wikipedia.org/wiki/Duri_(name)
Can't render this file because it has a wrong number of fields in line 2.

View File

@ -422,17 +422,19 @@ names:
intro:
- >
Przedstawiamy słownik neutralnych płciowo imion wraz z przydatnymi informacjami na ich temat.
- >
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Pellentesque vel tellus fringilla, sodales ex lobortis, congue nisl.
Vivamus non magna et nibh egestas maximus quis vel urna. Ut tristique nunc vel mollis fermentum.
Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae;
Cras vel suscipit diam. Nunc sem lacus, dignissim rutrum libero a, gravida euismod neque.
name: 'Imię'
origin: 'Pochodzenie'
meaning: 'Znaczenie'
usage: 'Użycie'
legally: 'USC może uznać za'
count: 'Osób w rejestrze PESEL'
namedays: 'Imieniny'
nameday: 'Imieniny'
namedaysComment: 'Skąd taka data imienin?'
links: 'Linki'
pros: 'Zalety'
cons: 'Wady'
notablePeople: 'Znane osoby'
empty: 'Nie znaleziono imion spełniających podane kryterium.'
faq:

31
migrations/036-names.sql Normal file

File diff suppressed because one or more lines are too long

View File

@ -7,6 +7,7 @@
<section>
<T>names.intro</T>
<NamesLinks/>
</section>
<section class="sticky-top">
@ -18,63 +19,65 @@
<button v-if="filter" class="btn btn-outline-danger" @click="filter = ''; $refs.filter.focus()">
<Icon v="times"/>
</button>
<button class="btn btn-outline-success" @click="$refs.form.$el.scrollIntoView({block: 'center'})">
<Icon v="plus-circle"/>
<T>nouns.submit.action</T>
</button>
</div>
</section>
<section>
<ul class="list-group small">
<template v-if="visibleNames().length">
<li v-for="name in visibleNames()" class="list-group-item">
<h3>
{{ name.name }}
</h3>
<div class="d-flex flex-column flex-md-row">
<ul class="list-unstyled w-md-50">
<li v-if="name.origin" class="my-1">
<Icon v="map-marked-alt"/>
<strong><T>names.origin</T>:</strong>
{{ name.origin }}
</li>
<li v-if="name.meaning" class="my-1">
<Icon v="comment-exclamation"/>
<strong><T>names.meaning</T>:</strong>
<LinkedText :text="name.meaning"/>
</li>
<li v-if="name.usage" class="my-1">
<Icon v="user-friends"/>
<strong><T>names.usage</T>:</strong>
{{ name.usage }}
</li>
<li v-if="config.names.legally && name.legally" class="my-1">
<Icon v="file-contract"/>
<strong><T>names.legally</T>:</strong>
{{ name.legally }}
</li>
<li v-if="config.names.count && name.count" class="my-1">
<Icon v="users"/>
<strong><T>names.count</T>:</strong>
<NameCount :name="name.name"/>
<li v-for="name in visibleNames()" :class="['list-group-item', name.approved ? '' : 'marked']">
<Name :name="name">
<ul class="list-inline small">
<template v-if="$isGranted('names')">
<li v-if="name.author" class="list-inline-item small">
<nuxt-link :to="`/@${name.author}`" class="btn btn-outline-dark btn-sm">
<Icon v="user"/>
<span class="btn-label">
<T>crud.author</T>:
@{{name.author}}
</span>
</nuxt-link>
</li>
<li v-if="!name.approved" class="list-inline-item">
<button class="btn btn-success btn-sm" @click="approve(name)">
<Icon v="check"/>
<span class="btn-label"><T>crud.approve</T></span>
</button>
</li>
<li v-else @click="hide(name)" class="list-inline-item">
<button class="btn btn-outline-secondary btn-sm">
<Icon v="times"/>
<span class="btn-label"><T>crud.hide</T></span>
</button>
</li>
<li class="list-inline-item">
<button class="btn btn-outline-danger btn-sm" @click="remove(name)">
<Icon v="trash"/>
<span class="btn-label"><T>crud.remove</T></span>
</button>
</li>
</template>
<li class="list-inline-item">
<button class="btn btn-outline-primary btn-sm" @click="edit(name)">
<Icon v="pen"/>
<span class="btn-label">
<T v-if="$isGranted('names')">crud.edit</T>
<T v-else>nouns.edit</T>
</span>
</button>
</li>
</ul>
<ul class="list-unstyled w-md-50">
<li v-for="pro in name.pros" class="my-1">
<Icon v="plus-circle"/>
{{ pro }}
</li>
<li v-for="con in name.cons" class="my-1">
<Icon v="minus-circle"/>
{{ con }}
</li>
<li v-for="person in name.notablePeople" class="my-1">
<Icon v="user"/>
{{ person }}
</li>
<li v-for="link in name.links" class="my-1">
<Icon v="external-link"/>
<a :href="link.trim()" target="_blank" rel="noopener">{{ clearUrl(link) }}</a>
</li>
</ul>
</div>
</Name>
<small v-if="name.base && names[name.base]">
<hr/>
<p><strong><T>nouns.edited</T>:</strong></p>
<Name :name="names[name.base]"/>
</small>
</li>
</template>
<template v-else>
@ -86,39 +89,92 @@
</ul>
</section>
<ScrollButton/>
<Separator icon="plus"/>
<section class="px-3">
<NameSubmitForm ref="form" style="scroll-padding-top: 2rem;"/>
</section>
</div>
</template>
<script>
import { names } from '~/src/data';
import { head, clearUrl } from '~/src/helpers';
import {head, buildDict} from '~/src/helpers';
import hash from "../plugins/hash";
import {Name} from "../src/classes";
export default {
mixins: [ hash ],
data() {
return {
names,
clearUrl,
filter: '',
}
},
async asyncData({app}) {
return {
namesRaw: await app.$axios.$get(`/names`),
}
},
mounted() {
this.handleHash('', filter => {
this.filter = filter;
this.$refs.filter.focus();
this.$refs.filter.scrollIntoView();
setTimeout(_ => {
if (filter) {
this.$refs.filter.focus();
this.$refs.filter.scrollIntoView();
}, 1000);
setTimeout(_ => {
this.$refs.filter.scrollIntoView();
}, 1000);
}
});
},
computed: {
names() {
if (this.namesRaw === undefined) {
return {};
}
return buildDict(function* (that) {
const sorted = that.namesRaw.sort((a, b) => {
if (a.approved && !b.approved) {
return 1;
}
if (!a.approved && b.approved) {
return -1;
}
return a.name.toLowerCase().localeCompare(b.name.toLowerCase());
});
for (let n of sorted) {
yield [n.id, new Name(n)];
}
}, this);
},
},
methods: {
visibleNames() {
return Object.values(this.names)
.filter(n => n.matches(this.filter))
.sort((a, b) => a.name.localeCompare(b.name));
return Object.values(this.names).filter(n => n.matches(this.filter));
},
edit(name) {
this.$refs.form.edit(name);
},
async approve(name) {
await this.$post(`/names/approve/${name.id}`);
if (name.base) {
delete this.names[name.base];
}
name.approved = true;
name.base = null;
this.$forceUpdate();
},
async hide(name) {
await this.$post(`/names/hide/${name.id}`);
name.approved = false;
this.$forceUpdate();
},
async remove(name) {
await this.$confirm(this.$t('crud.removeConfirm'), 'danger');
await this.$post(`/names/remove/${name.id}`);
delete this.names[name.id];
this.$forceUpdate();
},
},
watch: {
@ -143,4 +199,8 @@
width: 50%;
}
}
.list-group-item.marked {
border-inline-start: 3px solid $primary;
}
</style>

View File

@ -36,8 +36,6 @@
<!-- TODO <SourceList v-if="person.sources.length" :names="person.sources"/> -->
</li>
</ul>
<ScrollButton/>
</div>
</template>

View File

@ -95,6 +95,7 @@ app.use(require('./routes/inclusive').default);
app.use(require('./routes/terms').default);
app.use(require('./routes/pronounce').default);
app.use(require('./routes/census').default);
app.use(require('./routes/names').default);
app.use(require('./routes/images').default);
app.use(require('./routes/blog').default);

111
server/routes/names.js Normal file
View File

@ -0,0 +1,111 @@
import { Router } from 'express';
import SQL from 'sql-template-strings';
import {ulid} from "ulid";
import {handleErrorAsync, isTroll} from "../../src/helpers";
import { caches } from "../../src/cache";
const approve = async (db, id) => {
const { base_id } = await db.get(SQL`SELECT base_id FROM names WHERE id=${id}`);
if (base_id) {
await db.get(SQL`
UPDATE names
SET deleted=1
WHERE id = ${base_id}
`);
}
await db.get(SQL`
UPDATE names
SET approved = 1, base_id = NULL
WHERE id = ${id}
`);
await caches.names.invalidate();
}
const router = Router();
router.get('/names', handleErrorAsync(async (req, res) => {
return res.json(await caches.names.fetch(async () => {
return await req.db.all(SQL`
SELECT n.*, u.username AS author FROM names n
LEFT JOIN users u ON n.author_id = u.id
WHERE n.locale = ${global.config.locale}
AND n.deleted = 0
AND n.approved >= ${req.isGranted('names') ? 0 : 1}
ORDER BY n.approved, n.name
`)
}, !req.isGranted('names')));
}));
router.post('/names/submit', handleErrorAsync(async (req, res) => {
if (!req.user) {
res.status(401).json({error: 'Unauthorised'});
}
if (!(req.user && req.user.admin) && isTroll(JSON.stringify(req.body))) {
return res.json('ok');
}
const id = ulid();
await req.db.get(SQL`
INSERT INTO names (id, name, locale, origin, meaning, usage, legally, pros, cons, notablePeople, links, namedays, namedaysComment, deleted, approved, base_id, author_id)
VALUES (
${id},
${req.body.name}, ${global.config.locale},
${req.body.origin || null}, ${req.body.meaning || null}, ${req.body.usage || null}, ${req.body.legally || null},
${req.body.pros.length ? req.body.pros.join('|') : null}, ${req.body.cons.length ? req.body.cons.join('|') : null},
${req.body.notablePeople.length ? req.body.notablePeople.join('|') : null}, ${req.body.links.length ? req.body.links.join('|') : null},
${req.body.namedays.length ? req.body.namedays.join('|') : null}, ${req.body.namedaysComment || null},
0, 0, ${req.body.base}, ${req.user ? req.user.id : null}
)
`);
if (req.isGranted('names')) {
await approve(req.db, id);
}
return res.json('ok');
}));
router.post('/names/hide/:id', handleErrorAsync(async (req, res) => {
if (!req.isGranted('names')) {
res.status(401).json({error: 'Unauthorised'});
}
await req.db.get(SQL`
UPDATE names
SET approved = 0
WHERE id = ${req.params.id}
`);
await caches.names.invalidate();
return res.json('ok');
}));
router.post('/names/approve/:id', handleErrorAsync(async (req, res) => {
if (!req.isGranted('names')) {
res.status(401).json({error: 'Unauthorised'});
}
await approve(req.db, req.params.id);
return res.json('ok');
}));
router.post('/names/remove/:id', handleErrorAsync(async (req, res) => {
if (!req.isGranted('names')) {
res.status(401).json({error: 'Unauthorised'});
}
await req.db.get(SQL`
UPDATE names
SET deleted=1
WHERE id = ${req.params.id}
`);
await caches.names.invalidate();
return res.json('ok');
}));
export default router;

View File

@ -39,4 +39,5 @@ export const caches = {
nouns: new CacheObject('main', 'nouns.js', 10),
terms: new CacheObject('main', 'terms.js', 10),
inclusive: new CacheObject('main', 'inclusive.js', 10),
names: new CacheObject('main', 'names.js', 10),
}

View File

@ -761,17 +761,22 @@ export class TermsEntry {
}
export class Name {
constructor(name, origin, meaning, usage, legally, pros, cons, notablePeople, count, links) {
constructor({id, name, origin, meaning, usage, legally, pros, cons, notablePeople, links, namedays, namedaysComment, approved, base_id = null, author = null}) {
this.id = id;
this.name = name;
this.origin = origin;
this.meaning = meaning;
this.usage = usage;
this.legally = legally;
this.pros = pros;
this.cons = cons;
this.notablePeople = notablePeople;
this.count = count; // TODO
this.links = links.filter(l => l.trim().length);
this.pros = pros ? pros.split('|') : [];
this.cons = cons ? cons.split('|') : [];
this.notablePeople = notablePeople ? notablePeople.split('|') : [];
this.links = links ? links.split('|') : [];
this.namedays = namedays ? namedays.split('|') : [];
this.namedaysComment = namedaysComment;
this.approved = !!approved;
this.base = base_id;
this.author = author;
}
matches(filter) {

View File

@ -49,24 +49,6 @@ export const pronounGroups = buildList(function* () {
export const pronounLibrary = new PronounLibrary(pronounGroups, pronouns);
import namesRaw from '../data/names/names.tsv';
export const names = buildDict(function* () {
for (let n of namesRaw) {
yield [n.name, new Name(
n.name,
n.origin,
n.meaning,
n.usage,
n.legally,
n.pros ? n.pros.split(',') : [],
n.cons ? n.cons.split(',') : [],
n.notablePeople ? n.notablePeople.split(',') : [],
n.count,
n.links ? n.links.split(' ') : [],
)];
}
});
import peopleRaw from '../data/people/people.tsv';
export const people = buildList(function* () {
for (let p of peopleRaw) {