Merge branch 'dev'

This commit is contained in:
les
2019-09-06 11:59:13 +02:00
48 changed files with 489 additions and 238 deletions

View File

@@ -5,7 +5,7 @@
el-button.top.d-block.d-sm-none(icon='el-icon-top' circle type='primary' plain)
a.totop(name='totop')
//- el-backtop(target='#home')
no-ssr
client-only
Calendar
.row.m-0

View File

@@ -20,7 +20,7 @@
inactive-color='lightgreen'
v-model='showPast'
)
no-ssr
client-only
el-select.search(v-model='filter'
multiple
filterable collapse-tags default-first-option

View File

@@ -18,7 +18,7 @@
type='success'
@click='place = data.row') {{$t('common.edit')}}
no-ssr
client-only
el-pagination(:page-size='perPage' :currentPage.sync='placePage' :total='places.length')
</template>
<script>

View File

@@ -39,7 +39,7 @@ div
div(v-else)
span {{$t('common.me')}}
no-ssr
client-only
el-pagination(:page-size='perPage' :currentPage.sync='userPage' :total='users_.length')
</template>
@@ -111,7 +111,7 @@ export default {
Message({
showClose: true,
type: 'error',
message: this.$t('user.error_create') + e
message: this.$t(e)
})
}
},

View File

@@ -20,9 +20,6 @@
"secure": true,
"host": ""
},
"admin": {
"email": "",
"password": ""
},
"admin": "info@gancio.org",
"secret": "notsosecret"
}

View File

@@ -1,8 +1,17 @@
{
"email.registration": "email.registration",
"email.register.subject": "email.register.subject",
"email.register": "email.register",
"email.confirm": "email.confirm",
"email.recover": "email.recover",
"email.press_here": "email.press_here"
}
"register":{
"subject": "Richiesta registrazione ricevuta",
"content": "Abbiamo ricevuto la richiesta di registrazione. La confermeremo quanto prima.\n Ciao"
},
"confirm": {
"subject": "Puoi iniziare a pubblicare eventi",
"content": "Ciao, il tuo account su <a href='{{config.baseurl}}'>{{config.title}}<a/> è stato creato. <a href='{{config.baseurl}}/user_confirm/{{user.recover_code}}'>Confermalo</a>."
},
"recover": {
"subject": "Recupero password",
"content": "Ciao, hai richiesto un recupero della password su {{config.title}}."
},
"common": {
"press_here": "Premi qui"
}
}

View File

@@ -1,8 +1,17 @@
{
"email.registration": "email.registration",
"email.register.subject": "email.register.subject",
"email.register": "email.register",
"email.confirm": "email.confirm",
"email.recover": "email.recover",
"email.press_here": "email.press_here"
}
"register":{
"subject": "Richiesta registrazione ricevuta",
"content": "Abbiamo ricevuto la richiesta di registrazione. La confermeremo quanto prima.\n Ciao"
},
"confirm": {
"subject": "Puoi iniziare a pubblicare eventi",
"content": "Ciao, il tuo account su <a href='{{config.baseurl}}'>{{config.title}}<a/> è stato creato. <a href='{{config.baseurl}}/user_confirm/{{user.recover_code}}'>Confermalo</a>."
},
"recover": {
"subject": "Recupero password",
"content": "Ciao, hai richiesto un recupero della password su {{config.title}}."
},
"common": {
"press_here": "Premi qui"
}
}

View File

@@ -1,10 +1,18 @@
{
"email.register.subject": "Richiesta registrazione ricevuta",
"email.register": "Abbiamo ricevuto la richiesta di registrazione. La confermeremo quanto prima.\n Ciao",
"email.confirm": "Il tuo account su {{config.title}} è stato attivato e quindi puoi cominciare a pubblicare eventi",
"email.recover.subject": "Recupero password",
"email.recover": "Ciao, hai richiesto un recupero della password su {{config.title}}.",
"email.press_here": "Premi qui",
"email.confirm.subject": "Registrazione confermata",
"email.user_confirm": "Ciao, il tuo account su <a href='{{config.baseurl}}'>{{config.title}}<a/> è stato creato. <a href='{{config.baseurl}}/user_confirm/{{user.recover_code}}'>Confermalo</a>."
"register":{
"subject": "Richiesta registrazione ricevuta",
"content": "Abbiamo ricevuto la richiesta di registrazione. La confermeremo quanto prima.\n Ciao"
},
"confirm": {
"subject": "Puoi iniziare a pubblicare eventi",
"content": "Ciao, il tuo account su <a href='{{config.baseurl}}'>{{config.title}}<a/> è stato creato. <a href='{{config.baseurl}}/user_confirm/{{user.recover_code}}'>Confermalo</a>."
},
"recover": {
"subject": "Recupero password",
"content": "Ciao, hai richiesto un recupero della password su {{config.title}}. <a href='{{config.baseurl}}/recover/{{user.recover_code}}'>Premi qui</a> per confermare"
},
"admin_register":{
"subject": "Nuova registrazione",
"content": "{{user.username}} si è registrato/a a {{config.title}} scrivendo:<br/><pre>{{user.description}}</pre><br/> Puoi confermarlo <a href='{{config.baseurl}}/admin'>qui</a>."
}
}

View File

@@ -1,8 +0,0 @@
{
"email.registration": "email.registration",
"email.register.subject": "email.register.subject",
"email.register": "email.register",
"email.confirm": "email.confirm",
"email.recover": "email.recover",
"email.press_here": "email.press_here"
}

View File

@@ -160,8 +160,9 @@ Adding this link to your feed reader will keep you up to date.`,
remove_account_confirm: 'You are about to permanently delete your account',
},
err: {
register_error: 'Error during registration'
error: {
nick_taken: 'This nickname is already used',
email_taken: 'This email is already used'
},
ordinal: {

View File

@@ -1,3 +1,211 @@
{
"registration_email": "registration_email"
}
export default {
common: {
add_event: 'Nuevo evento',
next: 'Continúa',
export: 'Exporta',
send: 'Envía',
where: 'Donde',
address: 'Dirección',
when: 'Cuando',
what: 'Cosa',
media: 'Media', // media in che senso? in che contesto?
login: 'Entrá',
email: 'Email',
password: 'Contraseña',
register: 'Regístrate',
description: 'Descripción',
remove: 'Elimina',
hide: 'Oculta',
search: 'Busca',
edit: 'Edita',
info: 'Info',
confirm: 'Confirma',
admin: 'Administra',
users: 'Usuarios',
events: 'Eventos',
places: 'Lugares',
settings: 'Opciones',
actions: 'Acciones',
deactivate: 'Desactiva',
remove_admin: 'Elimina Admin',
activate: 'Activa',
save: 'Guarda',
preview: 'Vista previa',
logout: 'Cierra sesión',
share: 'Exporta', // share non sarebbe condividi?
name: 'Nombre',
associate: 'Associa', // anche qui per capire ho bisogno del contesto
edit_event: 'Edita evento',
related: 'Memoria histórica', // ?
add: 'Agrega',
logout_ok: 'Sesión cerrada correctamente',
copy: 'Copia',
recover_password: 'Recupera contraseña',
new_password: 'Nuova contraseña',
new_user: 'Nuevo usuario',
ok: 'Ok',
cancel: 'Cancela',
enable: 'Habilita',
disable: 'Deshabilita',
me: 'Sos tú',
password_updated: 'Contraseña actualizada!',
username: 'Nickname',
comments: 'ningún comentario|un comentario|{n} comentarios'
},
login: {
description: 'Entrando podrás publicar nuevos eventos.',
check_email: 'Ravisa tu casilla de correo (también el spam o correo no deseado)',
not_registered: '¿No estás registrado/a?',
forgot_password: '¿Olvidaste la contraseña?',
error: 'Error: ',
insert_email: 'Ingresa tu email',
ok: 'Todo bien'
},
recover: {
not_valid_code: 'Mmmmm algo no salió bien...'
},
export: {
intro: `A diferencia de las plataformas del capitalismo, que hacen todo lo posible para mantener
datos y usuarios dentro de ellas, creemos las informaciones, así como las personas,
deben ser libres. Para esto, podés mantenerte actualizado sobre los eventos que te interesan como mejor te parezca,
sin necesariamente tener que pasar por este sitio.`,
email_description: `Podés recibir por mail los eventos que te interesan.`,
insert_your_address: 'Casilla de correo',
feed_description: `Para seguir las actualizaciones desde una computadora o teléfono inteligente sin la necesidad de abrir periódicamente el sitio, el método recomendado es usar los feeds RSS.</p>
<p>Con rss feeds, utilizás una aplicación especial para recibir actualizaciones de los sitios que más le interesan, como por ejemplo este. Es una buena manera de seguir muchos sitios muy rápidamente, sin la necesidad de crear una cuenta u otras complicaciones.</p>
<li>Si tenés Android, te sugerimos <a href="https://play.google.com/store/apps/details?id=net.frju.flym">Flym</a> o Feeder</li>
<li>Para iPhone/iPad podés usar <a href="https://itunes.apple.com/ua/app/feeds4u/id1038456442?mt=8">Feed4U</a></li>
<li>En el caso de una computadora aconsejamos Feedbro, se instala como plugin <a href="https://addons.mozilla.org/en-GB/firefox/addon/feedbroreader/">de Firefox </a>o <a href="https://chrome.google.com/webstore/detail/feedbro/mefgmmbdailogpfhfblcnnjfmnpnmdfa">de Chrome</a> y funciona con todos los principales sistemas.</li>
<br/>
Agregando este link a tu lector de feed, estarás siempre actualizado/a.`,
ical_description: `Las computadoras y los teléfonos inteligentes suelen estar equipados con una aplicación para administrar un calendario. Estos programas generalmente se pueden usar para importar un calendario remoto.`,
list_description: `Si tenés un sitio web y querés mostrar una lista de eventos, podés usar el siguiente código`
},
register: {
description: `Los movimientos sociales necesitan organizarse y autofinanciarse. <br/> Este es un regalo para ustedes, úsenlo solamente para eventos con fines no comerciales y obviamente antifascistas, antisexistas y antirracistas.
<br/> Antes de que puedas publicar <strong> debemos aprobar la cuenta </strong>. Como imaginarás, <strong> detrás de este sitio hay personas </strong> de carne y hueso, por esto te pedimos escribir algo para hacernos saber que tipos de eventos te gustaría publicar.`,
error: 'Error: ',
complete: 'Confirmaremos el registro lo antes posible.'
},
event: {
anon: 'Anónimo',
anon_description: `Podés ingresar un evento sin registrarte o iniciar sesión,
pero en este caso tendrás que esperar a que alguien lo lea para confirmar que
es un evento adecuado para este espacio, delegando esta elección. Además, no será posible modificarlo. <br/> <br/>
Si no te gusta, podés <a href='/login'> iniciar sesión </a> o <a href='/register'> registrarte </a>,
de lo contrario, continúa y recibirás una respuesta lo antes posible.`,
same_day: 'Mismo día',
what_description: 'Nombre evento',
description_description: 'Descripción, podés copiar y pegar',
tag_description: 'Tag...',
media_description: 'Podés agregar un volante (opcionál)',
added: 'Evento agregado',
added_anon: 'Evento agregado, será confirmado cuanto antes.',
where_description: `¿Dónde es? Si el lugar no está, escribilo y <b>presiona enter</b>. `,
confirmed: 'Evento confirmado',
not_found: 'Evento no encontrado',
remove_confirmation: `¿Estás seguro/a de querér eliminar este evento?`,
recurrent: `Recurrente`,
recurrent_description: 'Elegí la frecuencia y selecciona los días.',
multidate_description: '¿Un festival o más de un día? Elegí cuándo comienza y cuándo termina.',
multidate: 'Más días',
normal: 'Normal',
normal_description: 'Selecciona el d{ia.',
recurrent_1w_days: 'Cada {days}',
recurrent_2w_days: 'Un {days} cada dos',
recurrent_1m_days: '|El día {days} de cada mes|Los días {days} de cada mes',
recurrent_2m_days: '|El día {days} cada dos meses|Los días {days} cada dos meses',
recurrent_1m_ordinal: 'El {n} {days} de cada mes',
recurrent_2m_ordinal: '|El {n} {days} un mes sí y el otro no|El {n} {days} un mes sí y el otro no',
each_week: 'Cads semana',
each_2w: 'Cada dos semanas',
each_month: 'cada mes',
due: 'a las',
from: 'Desde las',
image_too_big: 'La imagén es demasiado grande! Tamaño máx 4M',
interact_with_me_at: 'Sígueme en el fediverso en'
},
admin: {
mastodon_instance: 'Instancia',
mastodon_description: 'Podés asociar una cuenta de mastodon a esta instancia de Gancio, cada evento se publicará también allí.',
place_description: `En el caso de que un lugar sea incorrecto o cambie de dirección, podés cambiarlo. <br/> En este caso hay que tener en cuenta que todos los eventos asociados con ese lugar cambiarán de dirección (¡incluso los pasados!)`,
event_confirm_description: 'Podés confirmar acá los eventos agregados por usuarios anónimos',
delete_user: 'Elimina',
remove_admin: 'Borra admin',
delete_user_confirm: '¿Estás seguro/a de borrar este usuario?',
user_remove_ok: 'Usuario eliminado',
user_create_ok: 'Usuario creado',
allow_registration_description : '¿Querés habilitar el registro?',
allow_anon_event: '¿Se pueden ingresar eventos anónimos (sujeto a confirmación)?',
allow_comments: 'Habilitar comentarios',
allow_recurrent_event: 'Habilitar eventos fijos',
recurrent_event_visible: 'Eventos fijos visibles por defecto',
federation: 'Federación / ActivityPub',
enable_federation: 'Habilita la federación!'
},
auth: {
not_confirmed: 'Todavía no hemos confirmado este email...',
fail: 'No pudimos autenticarte. ¿La contraseña es correcta? ¿Y el mail?'
},
settings: {
change_password: 'Cambia contraseña',
password_updated: 'Contraseña modificada',
danger_section: 'Sección peligrosa',
remove_account: 'Al presionar el siguiente botón, su usuario será eliminado. No serán eliminados los eventos que publicaste.',
remove_account_confirm: 'Estás por borrar definitivamente tu cuenta',
},
error: {
nick_taken: 'Este nickname ya está registrado',
email_taken: 'Este correo electrónico ya está registrado'
},
ordinal: {
1: 'primero',
2: 'segundo',
3: 'tercero',
4: 'cuarto',
5: 'quinto',
[-1]: 'último',
},
about: `
<p>
Gancio es un proyecto del <a href='https://autistici.org/underscore'>underscore hacklab</a> y es uno de los
servicios de <a href='https://cisti.org'>cisti.org</a>.</p>
<h5>¿Que es gancio?</h5>
<p>Gancio (se pronuncia "gancho") es una herramienta para compartir eventos orientado a las comunidades radicales.
Dentro del gancio pueden encontrar y agregar eventos.
Gancio, como todo <a href='https://cisti.org'> cisti.org </a> es una herramienta
antisexista, antirracista, antifascista y anticapitalista, así que piensen en eso cuando
van a publicar un evento. </p>
<h5>Ok, pero ¿que quiere decir gancio?</h5>
<p>
Literalmente sería "enganche", pero en realidad viene de una forma de decir que se usa en en Turín (Italia). Ahí si alguien dice: "ehi, ci diamo un gancio alle 8?" ("ehi, ¿nos damos un enganche a las 8?") quiere decir "ehí, ¿nos vemos a las 8?". "Darsi un gancio" es juntarse a una hora X en un lugar Y.</p>
<code>
<ul>
<li> ¿A qué hora es el <i>gancio</i> para ir a la marcha?</li>
<li> No se, de todos modos no puedo ir, ya tengo un <i>gancio</i> para ir a una reunión.</li>
</ul>
</code>
<h5> Contactos</h5>
<p>
¿Escribiste una nueva interfaz para gancio? ¿Querés abrir un gancio en tu ciudad?
¿Hay algo que te gustaría mejorar? Para contribuir el código fuente es libre y disponible
<a href='https://git.lattuga.net/cisti/gancio'>acá</a>. Ayuda y sugerencias son siempre bienvenidos, podés comunicarte con nosotros
enviando un mail a underscore arroba autistici.org</p>`
}

View File

@@ -1,6 +1,7 @@
import it from './it'
import en from './en'
import es from './es'
export default {
it, en
it, en, es
}

View File

@@ -50,7 +50,8 @@ export default {
me: 'Sei te',
password_updated: 'Password modificata!',
username: 'Nickname',
comments: 'nessun commento|un commento|{n} commenti'
comments: 'nessun commento|un commento|{n} commenti',
activate_user: 'Confermato'
},
login: {
@@ -165,8 +166,15 @@ export default {
remove_account_confirm: 'Stai per eliminare definitivamente il tuo account',
},
err: {
register_error: 'Errore nella registrazione'
error: {
nick_taken: 'Questo nick è già presente',
email_taken: 'Questa email è già registrata'
},
confirm: {
title: 'Conferma utente',
not_valid: 'Mmmmm qualcosa è andato storto.',
valid: 'Il tuo account è stato confermato, ora puoi <a href="/login">entrare</a>',
},
ordinal: {

View File

@@ -2,10 +2,10 @@ import acceptLanguage from 'accept-language'
export default function ({ req, app, store }) {
if (process.server) {
const acceptedLanguages = req.headers['accept-language']
const supportedLanguages = ['en', 'it']
const supportedLanguages = ['en', 'it', 'es']
acceptLanguage.languages(supportedLanguages)
const lang = acceptLanguage.get(acceptedLanguages)
store.commit('setLocale', lang || 'it')
store.commit('setLocale', lang || 'it')
app.i18n.locale = store.state.locale
}
}

View File

@@ -37,7 +37,7 @@
".nuxt/"
],
"dependencies": {
"@nuxtjs/auth": "^4.6.5",
"@nuxtjs/auth": "^4.8.2",
"@nuxtjs/axios": "^5.6.0",
"accept-language": "^3.0.18",
"axios": "^0.19.0",
@@ -68,13 +68,13 @@
"nuxt-express-module": "^0.0.11",
"pg": "^7.12.1",
"sass-loader": "^8.0.0",
"sequelize": "^5.18.0",
"sequelize": "^5.18.1",
"sequelize-cli": "^5.5.1",
"sharp": "^0.23.0",
"sqlite3": "^4.1.0",
"v-calendar": "^1.0.0-beta.14",
"vue-awesome": "^3.5.3",
"vue-clipboard2": "^0.3.0",
"vue-clipboard2": "^0.3.1",
"vue-i18n": "^8.14.0",
"yargs": "^14.0.0"
},
@@ -82,21 +82,21 @@
"@nuxtjs/eslint-config": "^1.1.2",
"babel-eslint": "^10.0.3",
"eslint": "^6.3.0",
"eslint-config-prettier": "^6.1.0",
"eslint-config-prettier": "^6.2.0",
"eslint-config-standard": ">=14.1.0",
"eslint-loader": "^3.0.0",
"eslint-plugin-import": ">=2.17.3",
"eslint-plugin-jest": ">=22.16.0",
"eslint-plugin-node": ">=9.2.0",
"eslint-plugin-jest": ">=22.17.0",
"eslint-plugin-node": ">=10.0.0",
"eslint-plugin-nuxt": ">=0.4.2",
"eslint-plugin-prettier": "^3.1.0",
"eslint-plugin-promise": ">=4.0.1",
"eslint-plugin-standard": ">=4.0.1",
"eslint-plugin-vue": "^5.2.2",
"less-loader": "^5.0.0",
"nodemon": "^1.19.1",
"nodemon": "^1.19.2",
"prettier": "^1.17.1",
"pug-plain-loader": "^1.0.0",
"webpack-cli": "^3.3.7"
"webpack-cli": "^3.3.8"
}
}

View File

@@ -5,7 +5,7 @@
h5 {{edit?$t('common.edit_event'):$t('common.add_event')}}
el-form(v-loading='loading')
no-ssr
client-only
el-tabs.mb-2(v-model='activeTab')
//- NOT LOGGED EVENT
@@ -90,7 +90,7 @@
el-time-select(v-model='time.end'
:picker-options="{start: '00:00', step: '00:30', end: '24:00'}")
List(v-if='event.type==="normal"' :events='todayEvents' :title='$t("event.same_day")')
List(v-if='event.type==="normal" && todayEvents.length' :events='todayEvents' :title='$t("event.same_day")')
el-button.float-right(@click='next' type='succes' :disabled='!couldProceed') {{$t('common.next')}}
//- MEDIA / FLYER / POSTER
@@ -193,14 +193,14 @@ export default {
data.event.place.name = event.place.name
data.event.place.address = event.place.address || ''
if (event.multidate) {
data.date = { start: new Date(event.start_datetime*1000), end: new Date(event.end_datetime*1000) }
data.date = { start: moment.unix(event.start_datetime), end: moment.unix(event.end_datetime) }
data.event.type = 'multidate'
} else if (event.recurrent ) {
data.event.type = 'recurrent'
data.event.recurrent = JSON.parse(event.recurrent)
} else {
data.event.type = 'normal'
data.date = new Date(event.start_datetime*1000)
data.date = moment.unix(event.start_datetime)
}
data.time.start = moment.unix(event.start_datetime).format('HH:mm')
@@ -251,19 +251,19 @@ export default {
const date_end = moment(this.date.end)
return this.events.filter(e =>
!e.multidate ?
date_start.isSame(e.start_datetime, 'day') ||
date_start.isBefore(e.start_datime) && date_end.isAfter(e.start_datetime) :
date_start.isSame(e.start_datetime, 'day') || date_start.isSame(e.end_datetime) ||
date_start.isAfter(e.start_datetime) && date_start.isBefore(e.end_datetime))
date_start.isSame(moment.unix(e.start_datetime), 'day') ||
date_start.isBefore(moment.unix(e.start_datime)) && date_end.isAfter(moment.unix(e.start_datetime)) :
date_start.isSame(moment.unix(e.start_datetime), 'day') || date_start.isSame(moment.unix(e.end_datetime)) ||
date_start.isAfter(moment.unix(e.start_datetime)) && date_start.isBefore(moment.unix(e.end_datetime)))
} else if (this.event.type === 'recurrent' ) {
} else {
const date = moment(this.date)
return this.events.filter(e =>
!e.multidate ?
!e.recurrent && date.isSame(moment(e.start_datetime), 'day') :
moment(e.start_datetime).isSame(date, 'day') ||
moment(e.start_datetime).isBefore(date) && moment(e.end_datetime).isAfter(date)
!e.recurrent && date.isSame(moment.unix(e.start_datetime), 'day') :
moment.unix(e.start_datetime).isSame(date, 'day') ||
moment.unix(e.start_datetime).isBefore(date) && moment.unix(e.end_datetime).isAfter(date)
)
}
},
@@ -273,13 +273,13 @@ export default {
attributes.push ({ key: 'today', dates: new Date(), highlight: { color: 'yellow' }})
attributes = attributes.concat(this.filteredEvents
.filter(e => !e.multidate)
.map(e => ({ key: e.id, dot: {}, dates: new Date(e.start_datetime)})))
.filter(e => !e.multidate && !e.recurrent)
.map(e => ({ key: e.id, dot: {}, dates: moment.unix(e.start_datetime).toDate()})))
attributes = attributes.concat(this.filteredEvents
.filter(e => e.multidate)
.filter(e => e.multidate && !e.recurrent)
.map( e => ({ key: e.id, highlight: {}, dates: {
start: new Date(e.start_datetime), end: new Date(e.end_datetime) }})))
start: moment.unix(e.start_datetime).toDate(), end: moment.unix(e.end_datetime).toDate() }})))
if (this.event.type === 'recurrent' && this.event.recurrent.frequency) {
const recurrent = {}

View File

@@ -1,7 +1,8 @@
<template lang="pug">
el-card#admin
nuxt-link.float-right(to='/')
v-icon(name='times' color='red')
el-button(circle icon='el-icon-close' type='danger' size='small' plain)
h5 {{$t('common.admin')}}
el-tabs(v-model='tab')
@@ -35,7 +36,7 @@
template(slot-scope='data')
el-button(type='primary' @click='confirm(data.row.id)' size='mini') {{$t('common.confirm')}}
el-button(type='success' @click='preview(data.row.id)' size='mini') {{$t('common.preview')}}
no-ssr
client-only
el-pagination(:page-size='perPage' :currentPage.sync='eventPage' :total='events.length')
//- SETTINGS

View File

@@ -44,7 +44,7 @@
small.float-right 🔖 {{event.likes.length}}
small.float-right.mr-3 {{event.boost.length}}<br/>
strong {{$tc('common.comments', event.comments.length)}} -
<small>{{$t('event.interact_with_me_at')}} <u>{{event.user.username}}@{{settings.baseurl|url2host}}</u></small>
<small>{{$t('event.interact_with_me_at')}} <u>{{event.user && event.user.username}}@{{settings.baseurl|url2host}}</u></small>
.card-header(v-for='comment in event.comments' :key='comment.id')
a.float-right(:href='comment.data.url')

View File

@@ -5,7 +5,7 @@
el-button(circle icon='el-icon-close' type='danger' size='small' plain)
h5 {{$t('common.register')}}
el-form(@submit.native.prevent='register' method='POST' action='/api/user/register')
el-form(@submit.native.prevent='register' method='POST' action='')
p(v-html="$t('register.description')")
el-input.mb-2(v-model='user.username' type='text' name='username'
@@ -23,7 +23,7 @@
v-icon(name='envelope-open-text')
el-button(plain type="success" native-type='submit'
:disabled='disabled') {{$t('common.send')}} <v-icon name='chevron-right'/>
:disabled='disabled') {{$t('common.send')}} <v-icon :name='loading?"circle-notch":"chevron-right"' :spin='loading'/>
</template>
<script>
@@ -35,8 +35,8 @@ export default {
name: 'Register',
data () {
return {
error: {},
user: { }
loading: false,
user: {}
}
},
head () {
@@ -57,6 +57,7 @@ export default {
methods: {
...mapActions(['login']),
async register () {
this.loading = true
try {
const { user } = await this.$axios.$post('/user/register', this.user)
Message({
@@ -66,13 +67,14 @@ export default {
})
this.$router.replace("/")
} catch (e) {
const error = get(e, 'e.response.data.errors[0].message', String(e))
const error = get(e, 'response.data.errors[0].message', String(e))
Message({
showClose: true,
message: this.$t('register.error') + this.$t(error),
message: this.$t(error),
type: 'error'
})
}
this.loading = false
}
}
}

View File

@@ -3,53 +3,27 @@
nuxt-link.float-right(to='/')
el-button(circle icon='el-icon-close' type='danger' size='small' plain)
h5 <img src='/favicon.ico'/> {{$t('common.activate_user')}}
div(v-if='valid')
el-form
el-form-item {{$t('common.password')}}
el-input(type='password', v-model='new_password')
el-button(plain type="success" icon='el-icon-send', @click='change_password') {{$t('common.send')}}
div(v-else) {{$t('recover.not_valid_code')}}
h5 <img src='/favicon.ico'/> {{$t('confirm.title')}}
p(v-if='valid' v-html='$t("confirm.valid")')
p(v-else) {{$t('confirm.not_valid')}}
</template>
<script>
import { Message } from 'element-ui'
export default {
name: 'Recover',
name: 'Confirm',
data () {
return { new_password: '' }
return { valid: true }
},
async asyncData({ params, $axios }) {
const code = params.code
const recover_code = params.code
try {
const valid = await $axios.$post('/user/check_recover_code', { recover_code: code })
return { valid, code }
}
catch (e) {
const valid = await $axios.$post('/user/check_recover_code', { recover_code })
return { valid }
} catch (e) {
return { valid: false }
}
},
methods: {
async change_password () {
try {
const res = await this.$axios.$post('/user/recover_password', { recover_code: this.code, password: this.new_password })
Message({
showClose: true,
type: 'success',
message: this.$t('common.password_updated')
})
this.$router.replace('/login')
} catch(e) {
Message({
showClose: true,
type: 'warning',
message: e
})
}
}
}
}
</script>

View File

@@ -7,7 +7,8 @@ import locale from 'element-ui/lib/locale'
const locales = {
it: require('element-ui/lib/locale/lang/it'),
en: require('element-ui/lib/locale/lang/en')
en: require('element-ui/lib/locale/lang/en'),
es: require('element-ui/lib/locale/lang/es')
}
export default ({ app, store }) => {

View File

@@ -1,6 +1,7 @@
import Vue from 'vue'
import moment from 'dayjs'
import 'dayjs/locale/it'
import 'dayjs/locale/es'
export default ({ app, store }) => {

View File

@@ -31,6 +31,7 @@ import 'vue-awesome/icons/envelope'
import 'vue-awesome/icons/calendar-day'
import 'vue-awesome/icons/calendar-week'
import 'vue-awesome/icons/calendar-alt'
import 'vue-awesome/icons/circle-notch'
import Icon from 'vue-awesome/components/Icon'

View File

@@ -8,7 +8,6 @@ const config = require('config')
const mail = require('../mail')
const { user: User, event: Event, tag: Tag, place: Place } = require('../models')
const settingsController = require('./settings')
const notifier = require('../../notifier')
const federation = require('../../federation/helpers')
const userController = {
@@ -40,10 +39,6 @@ const userController = {
}
},
async logout(req, res) {
},
async setToken(req, res) {
req.user.mastodon_auth = req.body
await req.user.save()
@@ -153,7 +148,6 @@ const userController = {
body.description = body.description
.replace(/(<([^>]+)>)/ig, '') // remove all tags from description
// .replace(/(https?:\/\/[^\s]+)/g, '<a href="$1">$1</a>') // add links
await event.update(body)
let place
@@ -192,7 +186,12 @@ const userController = {
if (!recover_code) return res.sendStatus(400)
const user = await User.findOne({ where: { recover_code: { [Op.eq]: recover_code } } })
if (!user) return res.sendStatus(400)
res.json(user)
try {
await user.update({ recover_code: ''})
res.sendStatus(200)
} catch (e) {
res.sendStatus(400)
}
},
async updatePasswordWithRecoverCode(req, res) {
@@ -201,6 +200,7 @@ const userController = {
if (!recover_code || !password) return res.sendStatus(400)
const user = await User.findOne({ where: { recover_code: { [Op.eq]: recover_code } } })
if (!user) return res.sendStatus(400)
user.recover_code = ''
user.password = password
try {
await user.save()
@@ -224,8 +224,8 @@ const userController = {
async update(req, res) {
const user = await User.findByPk(req.body.id)
if (user) {
if (!user.is_active && req.body.is_active) {
await mail.send(user.email, 'confirm', { user, config })
if (!user.is_active && req.body.is_active && user.recover_code) {
mail.send(user.email, 'confirm', { user, config })
}
await user.update(req.body)
res.json(user)
@@ -246,9 +246,11 @@ const userController = {
req.body.is_active = false
}
req.body.recover_code = crypto.randomBytes(16).toString('hex')
const user = await User.create(req.body)
try {
mail.send([user.email, config.admin], 'register', { user, config })
mail.send(user.email, 'register', { user, config })
mail.send(config.admin, 'admin_register', { user, config })
} catch (e) {
return res.status(400).json(e)
}

View File

@@ -34,7 +34,6 @@ const jwt = expressJwt({
// AUTH
api.post('/auth/login', userController.login)
api.post('/auth/logout', userController.logout)
api.get('/auth/user', jwt, fillUser, userController.current)
api.post('/user/recover', userController.forgotPassword)

View File

@@ -3,10 +3,12 @@ const path = require('path')
const moment = require('moment')
const config = require('config')
const settings = require('./controller/settings')
const debug = require('debug')('email')
moment.locale('it')
const mail = {
send(addresses, template, locals) {
debug(`Send ${template} email to ${addresses}`)
const email = new Email({
views: { root: path.join(__dirname, '..', 'emails') },
htmlToText: false,
@@ -18,15 +20,17 @@ const mail = {
}
},
message: {
from: `${config.title} <${config.smtp.auth.user}>`
from: `${config.title} <${config.admin}>`
},
send: true,
i18n: {
directory: path.join(__dirname, '..', '..', 'locales', 'email'),
objectNotation: true,
syncFiles: false,
updateFiles: false,
defaultLocale: settings.locale,
locales: ['en', 'it']
locale: settings.locale,
locales: ['it', 'es'],
},
transport: config.smtp
})
@@ -45,7 +49,7 @@ const mail = {
}
return email.send(msg)
.catch(e => {
console.error(e)
debug('Error sending email =>', e)
})
}
}

View File

@@ -36,11 +36,13 @@ module.exports = (sequelize, DataTypes) => {
event.hasMany(models.comment)
}
//
event.prototype.toAP = function (username, follower) {
const tags = this.tags && '-' + this.tags.map(t => '#' + t.tag).join(' ')
const content = `<b><a href='${config.baseurl}/event/${this.id}'>${this.title}</a></b> @${this.place.name}
${moment.unix(this.start_datetime).format('dddd, D MMMM (HH:mm)')}<br/>
${this.description.length > 200 ? this.description.substr(0, 200) + '...' : this.description} ${tags} <br/>`
return {
id: `${config.baseurl}/federation/m/c_${this.id}`,
type: 'Create',

View File

@@ -9,14 +9,14 @@ module.exports = (sequelize, DataTypes) => {
const user = sequelize.define('user', {
username: {
type: DataTypes.STRING,
unique: true,
unique: { msg: 'error.nick_taken' },
index: true,
allowNull: false
},
display_name: DataTypes.STRING,
email: {
type: DataTypes.STRING,
unique: true,
unique: { msg: 'error.email_taken' },
index: true,
allowNull: false
},
@@ -59,7 +59,6 @@ module.exports = (sequelize, DataTypes) => {
user.beforeCreate(async (user, options) => {
// generate rsa keys
console.error('generate rsa key')
const rsa = await generateKeyPair('rsa', {
modulusLength: 4096,
publicKeyEncoding: {

View File

@@ -0,0 +1,4 @@
extends ../layout.pug
block content
p !{t('admin_register.content', { user, config })}

View File

@@ -0,0 +1 @@
| [#{config.title}] #{t('admin_register.subject')}

View File

@@ -0,0 +1,6 @@
p= t('admin_register.content', { user, config })
hr
small #{config.title} / #{config.description}
br
small <a href="#{config.baseurl}">#{config.baseurl}</a>

View File

@@ -1,12 +1,3 @@
<!DOCTYPE html>
html(lang="en")
head
meta(charset="UTF-8")
meta(name="viewport", content="width=device-width, initial-scale=1.0")
meta(http-equiv="X-UA-Compatible", content="ie=edge")
title #{config.title}
body
p= t('email.confirm', { config })
hr
<a href="#{config.baseurl}"> #{config.title} - #{config.description}</a>
extends ../layout.pug
block content
p !{t('confirm.content', { config, user })}

View File

@@ -1 +1 @@
| [#{config.title}] #{t('email.confirm.subject')}
| [#{config.title}] #{t('confirm.subject')}

View File

@@ -0,0 +1 @@
p !{t('confirm.content', { config })}

View File

@@ -1,22 +1,21 @@
h3 #{event.title}
p Dove: #{event.place.name} - #{event.place.address}
p Quando: #{datetime(event.start_datetime)}
br
if event.image_path
<center>
<img style="height: 89vh; margin: 0 auto;" src="#{config.baseurl}/media/#{event.image_path}" />
</center>
p #{event.description}
extends ../layout.pug
block content
h3 #{event.title}
p Dove: #{event.place.name} - #{event.place.address}
p Quando: #{datetime(event.start_datetime)}
br
if event.image_path
<center>
<img style="height: 89vh; margin: 0 auto;" src="#{config.baseurl}/media/#{event.image_path}" />
</center>
p #{event.description}
each tag in event.tags
span ##{tag.tag}
br
<a href="#{config.baseurl}/event/#{event.id}">#{config.baseurl}/event/#{event.id}</a>
hr
if to_confirm
p Puoi confermare questo evento <a href="#{config.baseurl}/admin/confirm/#{event.id}">qui</a>
else
p Puoi eliminare queste notifiche <a href="#{config.baseurl}/del_notification/#{notification.remove_code}">qui</a>
hr
<a href="#{config.baseurl}">#{config.title} - #{config.description}</a>
each tag in event.tags
span ##{tag.tag}
br
<a href="#{config.baseurl}/event/#{event.id}">#{config.baseurl}/event/#{event.id}</a>
hr
if to_confirm
p Puoi confermare questo evento <a href="#{config.baseurl}/admin/confirm/#{event.id}">qui</a>
else
p Puoi eliminare queste notifiche <a href="#{config.baseurl}/del_notification/#{notification.remove_code}">qui</a>

View File

@@ -0,0 +1,21 @@
extends ../layout.pug
block content
h3 #{event.title}
p Dove: #{event.place.name} - #{event.place.address}
p Quando: #{datetime(event.start_datetime)}
br
if event.image_path
<center>
<img style="height: 89vh; margin: 0 auto;" src="#{config.baseurl}/media/#{event.image_path}" />
</center>
p #{event.description}
each tag in event.tags
span ##{tag.tag}
br
<a href="#{config.baseurl}/event/#{event.id}">#{config.baseurl}/event/#{event.id}</a>
hr
if to_confirm
p Puoi confermare questo evento <a href="#{config.baseurl}/admin/confirm/#{event.id}">qui</a>
else
p Puoi eliminare queste notifiche <a href="#{config.baseurl}/del_notification/#{notification.remove_code}">qui</a>

13
server/emails/layout.pug Normal file
View File

@@ -0,0 +1,13 @@
<!DOCTYPE html>
html(lang="en")
head
meta(charset="UTF-8")
meta(name="viewport", content="width=device-width, initial-scale=1.0")
meta(http-equiv="X-UA-Compatible", content="ie=edge")
title #{config.title}
body
block content
hr
small #{config.title} / #{config.description}
br
<a href='#{config.baseurl}'> #{config.baseurl}</a>

View File

@@ -1,12 +1,4 @@
<!DOCTYPE html>
html(lang="en")
head
meta(charset="UTF-8")
meta(name="viewport", content="width=device-width, initial-scale=1.0")
meta(http-equiv="X-UA-Compatible", content="ie=edge")
title #{config.title}
body
p= t('email.recover', {config})
extends ../layout.pug
hr
<a href="#{config.baseurl}/recover/#{user.recover_code}">#{t('email.press_here')}</a>
block content
p !{t('recover.content', {config, user})}

View File

@@ -1 +1 @@
= `[#{config.title}] ${t('email.recover')}`
| [#{config.title}] #{t('recover.subject')}

View File

@@ -0,0 +1 @@
p= !t('recover.content', {config, user})

View File

@@ -1,6 +1,4 @@
p= t('email.register')
extends ../layout.pug
hr
small #{config.title} / #{config.description}
br
<a href='#{config.baseurl}'> #{config.baseurl}</a>
block content
p !{t('register.content', { user, config })}

View File

@@ -1 +1 @@
| [#{config.title}] #{t('email.register.subject')}
| [#{config.title}] #{t('register.subject')}

View File

@@ -1,4 +1,4 @@
p= t('email.register')
p= t('register.content', { config, user })
hr
small #{config.title} / #{config.description}

View File

@@ -1,10 +1,3 @@
<!DOCTYPE html>
html(lang="en")
head
meta(charset="UTF-8")
meta(name="viewport", content="width=device-width, initial-scale=1.0")
meta(http-equiv="X-UA-Compatible", content="ie=edge")
title #{config.title}
body
p !{t('email.user_confirm', { config, user })}
extends ../layout.pug
block content
p !{t('confirm.content', { config, user })}

View File

@@ -1 +1 @@
= `[Gancio] Richiesta password recovery`
| [#{config.title}] #{t('confirm.subject')}

View File

@@ -0,0 +1 @@
p !{t('confirm.content', { config, user })}

View File

@@ -1,7 +1,5 @@
# STATIC
**This directory is not required, you can delete it if you don't want to use it.**
This directory contains your static files.
Each file inside this directory is mapped to `/`.
Thus you'd want to delete this README.md before deploying to production.

View File

@@ -997,18 +997,19 @@
webpack-node-externals "^1.7.2"
webpackbar "^4.0.0"
"@nuxtjs/auth@^4.6.5":
version "4.8.1"
resolved "https://registry.yarnpkg.com/@nuxtjs/auth/-/auth-4.8.1.tgz#e554bbd032fdcd08d9fddcb159f30ff2c7de5b1a"
integrity sha512-EsBiiWXnojOxQ1ouK07tsXMP8pLFiAc+L4NLd1NGr3Z45iGRrjwLLy/weOH65vJGqNYX3lIQBGYscUyzGaaAyg==
"@nuxtjs/auth@^4.8.2":
version "4.8.2"
resolved "https://registry.yarnpkg.com/@nuxtjs/auth/-/auth-4.8.2.tgz#0276fe3a4291b61ec0b7fd4328d43a118d47f603"
integrity sha512-LG+71qTGxValqDyhG1Zou5YyJSMQtMq4MaXd0gXsFFYlsPDEyysYtidoAG+LhUsO9grmAwWTvcqkXO2d94LNUg==
dependencies:
"@nuxtjs/axios" "^5.5.4"
body-parser "^1.19.0"
consola "^2.9.0"
cookie "^0.4.0"
dotprop "^1.2.0"
is-https "^1.0.0"
js-cookie "^2.2.0"
lodash "^4.17.11"
lodash "^4.17.15"
nanoid "^2.0.3"
"@nuxtjs/axios@^5.5.4":
@@ -1942,7 +1943,7 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==
body-parser@1.19.0, body-parser@^1.18.3:
body-parser@1.19.0, body-parser@^1.18.3, body-parser@^1.19.0:
version "1.19.0"
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
@@ -3740,10 +3741,10 @@ eslint-ast-utils@^1.0.0:
lodash.get "^4.4.2"
lodash.zip "^4.2.0"
eslint-config-prettier@^6.1.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.1.0.tgz#e6f678ba367fbd1273998d5510f76f004e9dce7b"
integrity sha512-k9fny9sPjIBQ2ftFTesJV21Rg4R/7a7t7LCtZVrYQiHEp8Nnuk3EGaDmsKSAnsPj0BYcgB2zxzHa2NTkIxcOLg==
eslint-config-prettier@^6.2.0:
version "6.2.0"
resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.2.0.tgz#80e0b8714e3f6868c4ac2a25fbf39c02e73527a7"
integrity sha512-VLsgK/D+S/FEsda7Um1+N8FThec6LqE3vhcMyp8mlmto97y3fGf3DX7byJexGuOb1QY0Z/zz222U5t+xSfcZDQ==
dependencies:
get-stdin "^6.0.0"
@@ -3791,13 +3792,13 @@ eslint-plugin-es@^1.4.0:
eslint-utils "^1.3.0"
regexpp "^2.0.1"
eslint-plugin-es@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz#12acae0f4953e76ba444bfd1b2271081ac620998"
integrity sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA==
eslint-plugin-es@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-2.0.0.tgz#0f5f5da5f18aa21989feebe8a73eadefb3432976"
integrity sha512-f6fceVtg27BR02EYnBhgWLFQfK6bN4Ll0nQFrBHOlCsAyxeZkn0NHns5O0YZOPrV1B3ramd6cgFwaoFLcSkwEQ==
dependencies:
eslint-utils "^1.4.2"
regexpp "^2.0.1"
regexpp "^3.0.0"
eslint-plugin-import@>=2.17.3, eslint-plugin-import@^2.18.0:
version "2.18.2"
@@ -3816,19 +3817,26 @@ eslint-plugin-import@>=2.17.3, eslint-plugin-import@^2.18.0:
read-pkg-up "^2.0.0"
resolve "^1.11.0"
eslint-plugin-jest@>=22.16.0, eslint-plugin-jest@^22.10.0:
eslint-plugin-jest@>=22.17.0:
version "22.17.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-22.17.0.tgz#dc170ec8369cd1bff9c5dd8589344e3f73c88cf6"
integrity sha512-WT4DP4RoGBhIQjv+5D0FM20fAdAUstfYAf/mkufLNTojsfgzc5/IYW22cIg/Q4QBavAZsROQlqppiWDpFZDS8Q==
dependencies:
"@typescript-eslint/experimental-utils" "^1.13.0"
eslint-plugin-jest@^22.10.0:
version "22.16.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-22.16.0.tgz#30c4e0e9dc331beb2e7369b70dd1363690c1ce05"
integrity sha512-eBtSCDhO1k7g3sULX/fuRK+upFQ7s548rrBtxDyM1fSoY7dTWp/wICjrJcDZKVsW7tsFfH22SG+ZaxG5BZodIg==
dependencies:
"@typescript-eslint/experimental-utils" "^1.13.0"
eslint-plugin-node@>=9.2.0:
version "9.2.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-9.2.0.tgz#b1911f111002d366c5954a6d96d3cd5bf2a3036a"
integrity sha512-2abNmzAH/JpxI4gEOwd6K8wZIodK3BmHbTxz4s79OIYwwIt2gkpEXlAouJXu4H1c9ySTnRso0tsuthSOZbUMlA==
eslint-plugin-node@>=10.0.0:
version "10.0.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-10.0.0.tgz#fd1adbc7a300cf7eb6ac55cf4b0b6fc6e577f5a6"
integrity sha512-1CSyM/QCjs6PXaT18+zuAXsjXGIGo5Rw630rSKwokSs2jrYURQc4R5JZpoanNCqwNmepg+0eZ9L7YiRUJb8jiQ==
dependencies:
eslint-plugin-es "^1.4.1"
eslint-plugin-es "^2.0.0"
eslint-utils "^1.4.2"
ignore "^5.1.1"
minimatch "^3.0.4"
@@ -6806,10 +6814,10 @@ nodemailer@^6.2.1:
resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.3.0.tgz#a89b0c62d3937bdcdeecbf55687bd7911b627e12"
integrity sha512-TEHBNBPHv7Ie/0o3HXnb7xrPSSQmH1dXwQKRaMKDBGt/ZN54lvDVujP6hKkO/vjkIYL9rK8kHSG11+G42Nhxuw==
nodemon@^1.19.1:
version "1.19.1"
resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.19.1.tgz#576f0aad0f863aabf8c48517f6192ff987cd5071"
integrity sha512-/DXLzd/GhiaDXXbGId5BzxP1GlsqtMGM9zTmkWrgXtSqjKmGSbLicM/oAy4FR0YWm14jCHRwnR31AHS2dYFHrg==
nodemon@^1.19.2:
version "1.19.2"
resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.19.2.tgz#b0975147dc99b3761ceb595b3f9277084931dcc0"
integrity sha512-hRLYaw5Ihyw9zK7NF+9EUzVyS6Cvgc14yh8CAYr38tPxJa6UrOxwAQ351GwrgoanHCF0FalQFn6w5eoX/LGdJw==
dependencies:
chokidar "^2.1.5"
debug "^3.1.0"
@@ -8681,6 +8689,11 @@ regexpp@^2.0.1:
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==
regexpp@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e"
integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==
regexpu-core@^4.5.4:
version "4.5.4"
resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae"
@@ -9085,10 +9098,10 @@ sequelize-pool@^2.3.0:
resolved "https://registry.yarnpkg.com/sequelize-pool/-/sequelize-pool-2.3.0.tgz#64f1fe8744228172c474f530604b6133be64993d"
integrity sha512-Ibz08vnXvkZ8LJTiUOxRcj1Ckdn7qafNZ2t59jYHMX1VIebTAOYefWdRYFt6z6+hy52WGthAHAoLc9hvk3onqA==
sequelize@^5.18.0:
version "5.18.0"
resolved "https://registry.yarnpkg.com/sequelize/-/sequelize-5.18.0.tgz#3ed8eda9ec741f64f134752e0765216d760d2efe"
integrity sha512-Kw2LHYpXGa1v5T3Q1r+cPvYeeCJV53RbpoDO/NAVZAUiGj/UFPxaJH9qV/pYw2AAhkNkyzfml6Ud6dieJllB2A==
sequelize@^5.18.1:
version "5.18.1"
resolved "https://registry.yarnpkg.com/sequelize/-/sequelize-5.18.1.tgz#31d5246dcdf01d0ac317454c28fb598359d5b60a"
integrity sha512-jngo7pqilyOycMv6ZEwHLVn2wuHi/xkSQZfwK4jhjG8ta1HWYJK3XyQDFdhVEOH1GEq9pnqaf+7Kwqm+eqXD9Q==
dependencies:
bluebird "^3.5.0"
cls-bluebird "^2.1.0"
@@ -10368,10 +10381,10 @@ vue-client-only@^2.0.0:
resolved "https://registry.yarnpkg.com/vue-client-only/-/vue-client-only-2.0.0.tgz#ddad8d675ee02c761a14229f0e440e219de1da1c"
integrity sha512-arhk1wtWAfLsJyxGMoEYhoBowM87/i6HLSG2LH/03Yog6i2d9JEN1peMP0Ceis+/n9DxdenGYZZTxbPPJyHciA==
vue-clipboard2@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/vue-clipboard2/-/vue-clipboard2-0.3.0.tgz#b04d3f9a2d46f12ca85178445930b38463640b22"
integrity sha512-6/Y9NJErWb4LNBLMgsJSdKb7KpF6/jqXagvKlYut6VQzQsNj6515FpwH0r5hhmeJMqaPzf1kxAw8L8Qvw/QBJQ==
vue-clipboard2@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/vue-clipboard2/-/vue-clipboard2-0.3.1.tgz#6e551fb7bd384889b28b0da3b12289ed6bca4894"
integrity sha512-H5S/agEDj0kXjUb5GP2c0hCzIXWRBygaWLN3NEFsaI9I3uWin778SFEMt8QRXiPG+7anyjqWiw2lqcxWUSfkYg==
dependencies:
clipboard "^2.0.0"
@@ -10527,10 +10540,10 @@ webpack-bundle-analyzer@^3.4.1:
opener "^1.5.1"
ws "^6.0.0"
webpack-cli@^3.3.7:
version "3.3.7"
resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.7.tgz#77c8580dd8e92f69d635e0238eaf9d9c15759a91"
integrity sha512-OhTUCttAsr+IZSMVwGROGRHvT+QAs8H6/mHIl4SvhAwYywjiylYjpwybGx7WQ9Hkb45FhjtsymkwiRRbGJ1SZQ==
webpack-cli@^3.3.8:
version "3.3.8"
resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.8.tgz#caeaebcc26f685db1736e5decd3f01aac30123ec"
integrity sha512-RANYSXwikSWINjHMd/mtesblNSpjpDLoYTBtP99n1RhXqVI/wxN40Auqy42I7y4xrbmRBoA5Zy5E0JSBD5XRhw==
dependencies:
chalk "2.4.2"
cross-spawn "6.0.5"