From b755f940d7c09a4d3ec470cf376d03cee2409f5f Mon Sep 17 00:00:00 2001 From: les Date: Thu, 5 Sep 2019 13:31:14 +0200 Subject: [PATCH 1/5] fix #9, better error during registration --- locales/en.js | 5 +++-- locales/it.js | 5 +++-- pages/register.vue | 4 ++-- server/api/models/user.js | 4 ++-- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/locales/en.js b/locales/en.js index 1bb1adb9..67309100 100644 --- a/locales/en.js +++ b/locales/en.js @@ -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: { diff --git a/locales/it.js b/locales/it.js index 26870c58..d1c49790 100644 --- a/locales/it.js +++ b/locales/it.js @@ -165,8 +165,9 @@ 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' }, ordinal: { diff --git a/pages/register.vue b/pages/register.vue index c4ba32b8..c608ed8f 100644 --- a/pages/register.vue +++ b/pages/register.vue @@ -66,10 +66,10 @@ 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' }) } diff --git a/server/api/models/user.js b/server/api/models/user.js index 078081b0..25c2c5cd 100644 --- a/server/api/models/user.js +++ b/server/api/models/user.js @@ -9,14 +9,14 @@ module.exports = (sequelize, DataTypes) => { const user = sequelize.define('user', { username: { type: DataTypes.STRING, - unique: true, + unique: { msg: 'error.username_taken' }, index: true, allowNull: false }, display_name: DataTypes.STRING, email: { type: DataTypes.STRING, - unique: true, + unique: { msg: 'error.email_taken' }, index: true, allowNull: false }, From cd95c7eb3b9e4bc4832a7b33d8d79b4fd3cbda2d Mon Sep 17 00:00:00 2001 From: les Date: Thu, 5 Sep 2019 13:46:40 +0200 Subject: [PATCH 2/5] fixes #7, add es locale --- locales/es.js | 214 +++++++++++++++++++++++++++++++++++++++++- locales/index.js | 3 +- middleware/i18n.js | 4 +- plugins/element-ui.js | 3 +- plugins/filters.js | 1 + 5 files changed, 218 insertions(+), 7 deletions(-) diff --git a/locales/es.js b/locales/es.js index f01ae3b9..1e49bf6e 100644 --- a/locales/es.js +++ b/locales/es.js @@ -1,3 +1,211 @@ -{ - "registration_email": "registration_email" -} \ No newline at end of file +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.

+ +

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.

+ +
  • Si tenés Android, te sugerimos Flym o Feeder
  • +
  • Para iPhone/iPad podés usar Feed4U
  • +
  • En el caso de una computadora aconsejamos Feedbro, se instala como plugin de Firefox o de Chrome y funciona con todos los principales sistemas.
  • +
    + 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.
    Este es un regalo para ustedes, úsenlo solamente para eventos con fines no comerciales y obviamente antifascistas, antisexistas y antirracistas. +
    Antes de que puedas publicar debemos aprobar la cuenta . Como imaginarás, detrás de este sitio hay personas 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.

    + Si no te gusta, podés iniciar sesión o registrarte , + 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 presiona enter. `, + 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.
    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: ` +

    + Gancio es un proyecto del underscore hacklab y es uno de los + servicios de cisti.org.

    + +
    ¿Que es gancio?
    +

    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 cisti.org es una herramienta + antisexista, antirracista, antifascista y anticapitalista, así que piensen en eso cuando + van a publicar un evento.

    + +
    Ok, pero ¿que quiere decir gancio?
    +

    + 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.

    + +
      +
    • ¿A qué hora es el gancio para ir a la marcha?
    • +
    • No se, de todos modos no puedo ir, ya tengo un gancio para ir a una reunión.
    • +
    +
    + +
    Contactos
    +

    + ¿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 + acá. Ayuda y sugerencias son siempre bienvenidos, podés comunicarte con nosotros + enviando un mail a underscore arroba autistici.org

    ` + +} diff --git a/locales/index.js b/locales/index.js index e7388210..6ef6c229 100644 --- a/locales/index.js +++ b/locales/index.js @@ -1,6 +1,7 @@ import it from './it' import en from './en' +import es from './es' export default { - it, en + it, en, es } diff --git a/middleware/i18n.js b/middleware/i18n.js index 419b12aa..aba9c471 100644 --- a/middleware/i18n.js +++ b/middleware/i18n.js @@ -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 } } diff --git a/plugins/element-ui.js b/plugins/element-ui.js index 3f0ec960..8dc97ea1 100644 --- a/plugins/element-ui.js +++ b/plugins/element-ui.js @@ -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 }) => { diff --git a/plugins/filters.js b/plugins/filters.js index 0a0ca7fd..9c9187cf 100644 --- a/plugins/filters.js +++ b/plugins/filters.js @@ -1,6 +1,7 @@ import Vue from 'vue' import moment from 'dayjs' import 'dayjs/locale/it' +import 'dayjs/locale/es' export default ({ app, store }) => { From 5ecee0b9a18ef08216b88f3cf1c5c144a362a25a Mon Sep 17 00:00:00 2001 From: les Date: Thu, 5 Sep 2019 14:41:40 +0200 Subject: [PATCH 3/5] minor --- server/api/models/user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/api/models/user.js b/server/api/models/user.js index 25c2c5cd..8cf22d67 100644 --- a/server/api/models/user.js +++ b/server/api/models/user.js @@ -9,7 +9,7 @@ module.exports = (sequelize, DataTypes) => { const user = sequelize.define('user', { username: { type: DataTypes.STRING, - unique: { msg: 'error.username_taken' }, + unique: { msg: 'error.nick_taken' }, index: true, allowNull: false }, From 2c2459162136d828492737b0080c7ed923d39066 Mon Sep 17 00:00:00 2001 From: les Date: Fri, 6 Sep 2019 11:55:38 +0200 Subject: [PATCH 4/5] upgrade deps --- components/Home.vue | 2 +- components/Search.vue | 2 +- components/admin/Places.vue | 2 +- components/admin/Users.vue | 4 +- config/default.json | 5 +- locales/email/zh.json | 8 ---- package.json | 16 +++---- pages/add/_edit.vue | 2 +- pages/admin.vue | 2 +- server/api/controller/user.js | 6 --- server/api/index.js | 1 - server/api/models/user.js | 1 - static/README.md | 2 - yarn.lock | 87 ++++++++++++++++++++--------------- 14 files changed, 66 insertions(+), 74 deletions(-) delete mode 100644 locales/email/zh.json diff --git a/components/Home.vue b/components/Home.vue index 9dbb51ce..511ccc39 100644 --- a/components/Home.vue +++ b/components/Home.vue @@ -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 diff --git a/components/Search.vue b/components/Search.vue index d28f4199..a9d613ca 100644 --- a/components/Search.vue +++ b/components/Search.vue @@ -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 diff --git a/components/admin/Places.vue b/components/admin/Places.vue index b465394d..33aacabe 100644 --- a/components/admin/Places.vue +++ b/components/admin/Places.vue @@ -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') diff --git a/plugins/vue-awesome.js b/plugins/vue-awesome.js index 272a74f5..cf51e673 100644 --- a/plugins/vue-awesome.js +++ b/plugins/vue-awesome.js @@ -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' diff --git a/server/api/controller/user.js b/server/api/controller/user.js index ce09cfab..72a875db 100644 --- a/server/api/controller/user.js +++ b/server/api/controller/user.js @@ -186,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) { @@ -195,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() @@ -218,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) @@ -240,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) } diff --git a/server/api/mail.js b/server/api/mail.js index e6072898..aa29674c 100644 --- a/server/api/mail.js +++ b/server/api/mail.js @@ -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) }) } } diff --git a/server/api/models/event.js b/server/api/models/event.js index b0033135..fbfe85f1 100644 --- a/server/api/models/event.js +++ b/server/api/models/event.js @@ -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 = `${this.title} @${this.place.name} ${moment.unix(this.start_datetime).format('dddd, D MMMM (HH:mm)')}
    ${this.description.length > 200 ? this.description.substr(0, 200) + '...' : this.description} ${tags}
    ` + return { id: `${config.baseurl}/federation/m/c_${this.id}`, type: 'Create', diff --git a/server/emails/admin_register/html.pug b/server/emails/admin_register/html.pug new file mode 100644 index 00000000..ed6530f9 --- /dev/null +++ b/server/emails/admin_register/html.pug @@ -0,0 +1,4 @@ +extends ../layout.pug + +block content + p !{t('admin_register.content', { user, config })} diff --git a/server/emails/admin_register/subject.pug b/server/emails/admin_register/subject.pug new file mode 100644 index 00000000..3bd1d5de --- /dev/null +++ b/server/emails/admin_register/subject.pug @@ -0,0 +1 @@ +| [#{config.title}] #{t('admin_register.subject')} diff --git a/server/emails/admin_register/text.pug b/server/emails/admin_register/text.pug new file mode 100644 index 00000000..f86b83e2 --- /dev/null +++ b/server/emails/admin_register/text.pug @@ -0,0 +1,6 @@ +p= t('admin_register.content', { user, config }) + +hr +small #{config.title} / #{config.description} +br +small #{config.baseurl} diff --git a/server/emails/confirm/html.pug b/server/emails/confirm/html.pug index 091b2829..bd40b296 100644 --- a/server/emails/confirm/html.pug +++ b/server/emails/confirm/html.pug @@ -1,12 +1,3 @@ - -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 - #{config.title} - #{config.description} +extends ../layout.pug +block content + p !{t('confirm.content', { config, user })} \ No newline at end of file diff --git a/server/emails/confirm/subject.pug b/server/emails/confirm/subject.pug index 52cb1fb6..72a6cbae 100644 --- a/server/emails/confirm/subject.pug +++ b/server/emails/confirm/subject.pug @@ -1 +1 @@ -| [#{config.title}] #{t('email.confirm.subject')} \ No newline at end of file +| [#{config.title}] #{t('confirm.subject')} \ No newline at end of file diff --git a/server/emails/confirm/text.pug b/server/emails/confirm/text.pug new file mode 100644 index 00000000..5d6afacb --- /dev/null +++ b/server/emails/confirm/text.pug @@ -0,0 +1 @@ +p !{t('confirm.content', { config })} \ No newline at end of file diff --git a/server/emails/event/html.pug b/server/emails/event/html.pug index b69a1962..71f28eb2 100644 --- a/server/emails/event/html.pug +++ b/server/emails/event/html.pug @@ -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 -
    - -
    -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 +
    + +
    + p #{event.description} -each tag in event.tags - span ##{tag.tag} -br -#{config.baseurl}/event/#{event.id} -hr -if to_confirm - p Puoi confermare questo evento qui -else - p Puoi eliminare queste notifiche qui - -hr -#{config.title} - #{config.description} + each tag in event.tags + span ##{tag.tag} + br + #{config.baseurl}/event/#{event.id} + hr + if to_confirm + p Puoi confermare questo evento qui + else + p Puoi eliminare queste notifiche qui diff --git a/server/emails/event/text.pug b/server/emails/event/text.pug new file mode 100644 index 00000000..71f28eb2 --- /dev/null +++ b/server/emails/event/text.pug @@ -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 +
    + +
    + p #{event.description} + + each tag in event.tags + span ##{tag.tag} + br + #{config.baseurl}/event/#{event.id} + hr + if to_confirm + p Puoi confermare questo evento qui + else + p Puoi eliminare queste notifiche qui diff --git a/server/emails/layout.pug b/server/emails/layout.pug new file mode 100644 index 00000000..5ff2bf28 --- /dev/null +++ b/server/emails/layout.pug @@ -0,0 +1,13 @@ + +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 + #{config.baseurl} \ No newline at end of file diff --git a/server/emails/recover/html.pug b/server/emails/recover/html.pug index d7b24e56..306d2690 100644 --- a/server/emails/recover/html.pug +++ b/server/emails/recover/html.pug @@ -1,12 +1,4 @@ - -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 - #{t('email.press_here')} +block content + p !{t('recover.content', {config, user})} \ No newline at end of file diff --git a/server/emails/recover/subject.pug b/server/emails/recover/subject.pug index 156103ca..2308d051 100644 --- a/server/emails/recover/subject.pug +++ b/server/emails/recover/subject.pug @@ -1 +1 @@ -= `[#{config.title}] ${t('email.recover')}` +| [#{config.title}] #{t('recover.subject')} diff --git a/server/emails/recover/text.pug b/server/emails/recover/text.pug new file mode 100644 index 00000000..4c47b008 --- /dev/null +++ b/server/emails/recover/text.pug @@ -0,0 +1 @@ +p= !t('recover.content', {config, user}) \ No newline at end of file diff --git a/server/emails/register/html.pug b/server/emails/register/html.pug index aef84feb..ec74ade9 100644 --- a/server/emails/register/html.pug +++ b/server/emails/register/html.pug @@ -1,6 +1,4 @@ -p= t('email.register') +extends ../layout.pug -hr -small #{config.title} / #{config.description} -br - #{config.baseurl} \ No newline at end of file +block content + p !{t('register.content', { user, config })} \ No newline at end of file diff --git a/server/emails/register/subject.pug b/server/emails/register/subject.pug index 6a7be433..c7613a90 100644 --- a/server/emails/register/subject.pug +++ b/server/emails/register/subject.pug @@ -1 +1 @@ -| [#{config.title}] #{t('email.register.subject')} +| [#{config.title}] #{t('register.subject')} diff --git a/server/emails/register/text.pug b/server/emails/register/text.pug index 7785b0cf..a4cb45f9 100644 --- a/server/emails/register/text.pug +++ b/server/emails/register/text.pug @@ -1,4 +1,4 @@ -p= t('email.register') +p= t('register.content', { config, user }) hr small #{config.title} / #{config.description} diff --git a/server/emails/user_confirm/html.pug b/server/emails/user_confirm/html.pug index 37f6aa32..7fcd2ce1 100644 --- a/server/emails/user_confirm/html.pug +++ b/server/emails/user_confirm/html.pug @@ -1,10 +1,3 @@ - -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 })} diff --git a/server/emails/user_confirm/subject.pug b/server/emails/user_confirm/subject.pug index 6d0067a6..72a6cbae 100644 --- a/server/emails/user_confirm/subject.pug +++ b/server/emails/user_confirm/subject.pug @@ -1 +1 @@ -= `[Gancio] Richiesta password recovery` +| [#{config.title}] #{t('confirm.subject')} \ No newline at end of file diff --git a/server/emails/user_confirm/text.pug b/server/emails/user_confirm/text.pug new file mode 100644 index 00000000..89326a44 --- /dev/null +++ b/server/emails/user_confirm/text.pug @@ -0,0 +1 @@ +p !{t('confirm.content', { config, user })}