Newer
Older
<Error v-else-if="!message"
:error="t('mail', 'Not found')"
:message="t('mail', 'This message does not exist. It may have been deleted.')">
</Error>
<div id="mail-message-header" class="section">
<h2 :title="message.subject">{{message.subject}}</h2>
<p class="transparency">
<AddressList :entries="message.from"/>
to <!-- TODO: translate -->
<AddressList :entries="message.to"/>
<template v-if="message.cc.length">
(cc <!-- TODO: translate -->
<AddressList :entries="message.cc"/><!--
-->)
</template>
</p>
<MessageHTMLBody v-if="message.hasHtmlBody"
:url="htmlUrl"
@loaded="onHtmlBodyLoaded"/>
<MessagePlainTextBody v-else
:body="message.body"
:signature="message.signature"/>
<MessageAttachments :attachments="message.attachments" />
<div id="reply-composer"></div>
<input type="button" id="forward-button" value="Forward">
</div>
<Composer v-if="!message.hasHtmlBody || htmlBodyLoaded"
:to="replyRecipient.to"
:cc="replyRecipient.cc"
:subject="replySubject"
:body="replyBody"
:replyTo="replyTo"
</div>
</template>
<script>
import { generateUrl } from 'nextcloud-server/dist/router'
import AddressList from './AddressList'
import {
buildReplyBody,
buildRecipients as buildReplyRecipients,
buildReplySubject,
} from '../ReplyBuilder'
import Error from './Error'
import {htmlToText} from '../util/HtmlHelper'
import MessageHTMLBody from './MessageHTMLBody'
import MessagePlainTextBody from './MessagePlainTextBody'
import Loading from './Loading'
import MessageAttachments from './MessageAttachments'
import {saveDraft, sendMessage} from '../service/MessageService'
components: {
AddressList,
Composer,
Error,
Loading,
MessageAttachments,
MessageHTMLBody,
MessagePlainTextBody,
},
loading: true,
message: undefined,
htmlBodyLoaded: false,
replyRecipient: {},
replySubject: '',
replyBody: '',
return generateUrl('/apps/mail/api/accounts/{accountId}/folders/{folderId}/messages/{id}/html', {
accountId: this.message.accountId,
folderId: this.message.folderId,
id: this.message.id
accountId: this.message.accountId,
folderId: this.message.folderId,
messageId: this.message.id,
created () {
this.fetchMessage()
},
watch: {
'$route' (to, from) {
this.fetchMessage()
}
},
fetchMessage () {
this.loading = true
this.message = undefined
this.replyRecipient = {}
this.replySubject = ''
this.replyBody = ''
this.htmlBodyLoaded = false
const messageUid = this.$route.params.messageUid
this.$store.dispatch('fetchMessage', messageUid)
.then(message => {
this.message = message
if (_.isUndefined(this.message)) {
console.info('message could not be found', messageUid)
this.loading = false
return
}
this.replyRecipient = buildReplyRecipients(message, {}) // TODO: own address
this.replySubject = buildReplySubject(message.subject)
if (!message.hasHtmlBody) {
this.setReplyText(message.body)
}
// TODO: add timeout so that message isn't flagged when only viewed
// for a few seconds
if (message.uid !== this.$route.params.messageUid) {
console.debug('User navigated away, loaded message won\'t be flagged as seen')
return
}
const envelope = this.$store.getters.getEnvelope(message.accountId, message.folderId, message.id);
if (!envelope.flags.unseen) {
// Already seen -> no change necessary
return
}
return this.$store.dispatch('toggleEnvelopeSeen', envelope)
})
.catch(console.error)
setReplyText (text) {
this.replyBody = buildReplyBody(
htmlToText(text),
this.message.from[0],
this.message.dateInt,
)
},
onHtmlBodyLoaded (bodyString) {
this.setReplyText(bodyString)
this.htmlBodyLoaded = true
},
saveReplyDraft (data) {
return saveDraft(data.account, data)
.then(({uid}) => uid)
},
sendReply (data) {
return sendMessage(data.account, data)
<style>
.mail-message-body {
margin-bottom: 100px;
}
#mail-message-header h2,
#mail-message-header p {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
padding-bottom: 7px;
margin-bottom: 0;
}
#mail-content,
.mail-message-attachments {
margin: 10px 10px 50px 30px;
}
.mail-message-attachments {
margin-top: 10px;
}
#mail-content iframe {
width: 100%;
}
#show-images-text {
display: none;
}
#mail-content a,
.mail-signature a {
color: #07d;
border-bottom: 1px dotted #07d;
text-decoration: none;
word-wrap: break-word;
}
#mail-message-header .transparency {
color: rgba(0, 0, 0, .3) !important;
opacity: 1;
}
#mail-message-header .transparency a {
color: rgba(0, 0, 0, .5) !important;
}
</style>