Compose email from admin panel
This commit is contained in:
parent
e1a66c38da
commit
7c0a94008d
@ -3,6 +3,7 @@ import express from 'express'
|
|||||||
import ensureLogin from '../../scripts/ensureLogin'
|
import ensureLogin from '../../scripts/ensureLogin'
|
||||||
import wrap from '../../scripts/asyncRoute'
|
import wrap from '../../scripts/asyncRoute'
|
||||||
import API from '../api/admin'
|
import API from '../api/admin'
|
||||||
|
import Emailer from '../api/emailer'
|
||||||
import {User} from '../api'
|
import {User} from '../api'
|
||||||
|
|
||||||
const router = express.Router()
|
const router = express.Router()
|
||||||
@ -287,6 +288,21 @@ apiRouter.post('/ban', csrfVerify, wrap(async (req, res) => {
|
|||||||
res.jsonp(result)
|
res.jsonp(result)
|
||||||
}))
|
}))
|
||||||
|
|
||||||
|
apiRouter.post('/email', csrfVerify, wrap(async (req, res) => {
|
||||||
|
if (!req.body.email) throw new Error('Email missing')
|
||||||
|
if (!req.body.title) throw new Error('Title missing')
|
||||||
|
if (!req.body.content) throw new Error('Content missing')
|
||||||
|
|
||||||
|
var message = {
|
||||||
|
subject: req.body.title,
|
||||||
|
html: req.body.content
|
||||||
|
}
|
||||||
|
|
||||||
|
let result = await Emailer.sendMail(req.body.email, message)
|
||||||
|
|
||||||
|
res.jsonp(result)
|
||||||
|
}))
|
||||||
|
|
||||||
apiRouter.use((err, req, res, next) => {
|
apiRouter.use((err, req, res, next) => {
|
||||||
console.error(err)
|
console.error(err)
|
||||||
return res.status(400).jsonp({error: err.message})
|
return res.status(400).jsonp({error: err.message})
|
||||||
|
59
src/script/component/MailerModal.vue
Normal file
59
src/script/component/MailerModal.vue
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
<template lang="pug">
|
||||||
|
modal(:show='show', @close='close')
|
||||||
|
.modal-header
|
||||||
|
h3 Send Email
|
||||||
|
.modal-body.aligned-form
|
||||||
|
.alert.alert-danger(v-if='error') {{ error }}
|
||||||
|
.form-group
|
||||||
|
label(for="email") Email
|
||||||
|
input.form-control(type="email" id="email" name="email" v-model="email")
|
||||||
|
.form-group
|
||||||
|
label(for="title") Title
|
||||||
|
input.form-control(type="text" id="title" name="title" v-model="title")
|
||||||
|
.form-group
|
||||||
|
label(for="content") Content
|
||||||
|
textarea.form-control(type="text" id="content" name="content" v-model="content")
|
||||||
|
.modal-footer.text-right
|
||||||
|
button.btn.btn-primary(@click='submit') Done
|
||||||
|
button.btn.btn-secondary(@click='close') Cancel
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
import Modal from './Modal.vue'
|
||||||
|
const csrfToken = document.querySelector('meta[name="csrf-token"]').content
|
||||||
|
|
||||||
|
export default {
|
||||||
|
props: ['show', 'email'],
|
||||||
|
data: function () {
|
||||||
|
return {
|
||||||
|
error: '',
|
||||||
|
title: '',
|
||||||
|
content: ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
components: {
|
||||||
|
Modal
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
close: function () {
|
||||||
|
this.$emit('close')
|
||||||
|
this.error = ''
|
||||||
|
this.title = ''
|
||||||
|
this.content = ''
|
||||||
|
},
|
||||||
|
submit: function () {
|
||||||
|
this.$http.post('/admin/api/email', {
|
||||||
|
email: this.email,
|
||||||
|
title: this.title,
|
||||||
|
content: this.content,
|
||||||
|
csrf: csrfToken
|
||||||
|
}).then(data => {
|
||||||
|
this.close()
|
||||||
|
}).catch(err => {
|
||||||
|
console.error(err)
|
||||||
|
if (err.body && err.body.error) this.error = err.body.error
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
@ -40,6 +40,9 @@
|
|||||||
.action(v-on:click='resetPassword')
|
.action(v-on:click='resetPassword')
|
||||||
i.fa.fa-fw.fa-envelope
|
i.fa.fa-fw.fa-envelope
|
||||||
| Password Email
|
| Password Email
|
||||||
|
.action(v-on:click='$parent.$emit("email", email)')
|
||||||
|
i.fa.fa-fw.fa-envelope
|
||||||
|
| Compose Email
|
||||||
.separator
|
.separator
|
||||||
.action(v-on:click='$parent.$emit("lock", id)' v-if="id != 1 && nw_privilege < 2")
|
.action(v-on:click='$parent.$emit("lock", id)' v-if="id != 1 && nw_privilege < 2")
|
||||||
i.fa.fa-fw.fa-lock
|
i.fa.fa-fw.fa-lock
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
ban-modal(:show='banning' @close='banning = 0' :id='banning')
|
ban-modal(:show='banning' @close='banning = 0' :id='banning')
|
||||||
user-modal(:show='editing' @close='editing = 0' :id='editing')
|
user-modal(:show='editing' @close='editing = 0' :id='editing')
|
||||||
user-lock-modal(:show='locking' @close='locking = 0' :id='locking')
|
user-lock-modal(:show='locking' @close='locking = 0' :id='locking')
|
||||||
|
mailer-modal(:show='emailing' @close='emailing = null' :email='emailing')
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@ -17,6 +18,7 @@
|
|||||||
import User from './User.vue'
|
import User from './User.vue'
|
||||||
import BanModal from './BanModal.vue'
|
import BanModal from './BanModal.vue'
|
||||||
import UserModal from './UserModal.vue'
|
import UserModal from './UserModal.vue'
|
||||||
|
import MailerModal from './MailerModal.vue'
|
||||||
import UserLockModal from './UserLockModal.vue'
|
import UserLockModal from './UserLockModal.vue'
|
||||||
|
|
||||||
import qs from 'querystring'
|
import qs from 'querystring'
|
||||||
@ -36,12 +38,13 @@
|
|||||||
banning: 0,
|
banning: 0,
|
||||||
editing: 0,
|
editing: 0,
|
||||||
locking: 0,
|
locking: 0,
|
||||||
|
emailing: null,
|
||||||
search: '',
|
search: '',
|
||||||
error: ''
|
error: ''
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
Pagination, User, BanModal, UserModal, UserLockModal
|
Pagination, User, BanModal, UserModal, UserLockModal, MailerModal
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
getUsers: function (page) {
|
getUsers: function (page) {
|
||||||
@ -91,6 +94,10 @@
|
|||||||
this.locking = id
|
this.locking = id
|
||||||
})
|
})
|
||||||
|
|
||||||
|
this.$on('email', function (email) {
|
||||||
|
this.emailing = email
|
||||||
|
})
|
||||||
|
|
||||||
this.$root.$on('reload_users', () => {
|
this.$root.$on('reload_users', () => {
|
||||||
this.getUsers(this.pagination.page)
|
this.getUsers(this.pagination.page)
|
||||||
})
|
})
|
||||||
|
Reference in New Issue
Block a user