1
0
forked from test/crm

fix: email replied collapser for gmail

This commit is contained in:
Shariq Ansari 2024-07-12 17:33:26 +05:30
parent f7449481df
commit acf761694f

View File

@ -32,20 +32,23 @@ const _content = ref(props.content)
const parser = new DOMParser() const parser = new DOMParser()
const doc = parser.parseFromString(_content.value, 'text/html') const doc = parser.parseFromString(_content.value, 'text/html')
const gmailReplyToContent = doc.querySelectorAll('div.gmail_quote')
const replyToContent = doc.querySelectorAll('p.reply-to-content') const replyToContent = doc.querySelectorAll('p.reply-to-content')
if (replyToContent.length) { if (gmailReplyToContent.length) {
_content.value = parseReplyToContent(doc) _content.value = parseReplyToContent(doc, 'div.gmail_quote', true)
} else if (replyToContent.length) {
_content.value = parseReplyToContent(doc, 'p.reply-to-content')
} }
function parseReplyToContent(doc) { function parseReplyToContent(doc, selector, forGmail = false) {
function handleAllInstances(doc) { function handleAllInstances(doc) {
const replyToContentElements = doc.querySelectorAll('p.reply-to-content') const replyToContentElements = doc.querySelectorAll(selector)
if (replyToContentElements.length === 0) { if (replyToContentElements.length === 0) {
return return
} }
const replyToContentElement = replyToContentElements[0] const replyToContentElement = replyToContentElements[0]
replaceReplyToContent(replyToContentElement) replaceReplyToContent(replyToContentElement, forGmail)
handleAllInstances(doc) handleAllInstances(doc)
} }
@ -54,7 +57,7 @@ function parseReplyToContent(doc) {
return doc.body.innerHTML return doc.body.innerHTML
} }
function replaceReplyToContent(replyToContentElement) { function replaceReplyToContent(replyToContentElement, forGmail) {
let randomId = Math.random().toString(36).substring(2, 7) let randomId = Math.random().toString(36).substring(2, 7)
const wrapper = doc.createElement('div') const wrapper = doc.createElement('div')
wrapper.classList.add('replied-content') wrapper.classList.add('replied-content')
@ -71,21 +74,31 @@ function replaceReplyToContent(replyToContentElement) {
collapseInput.setAttribute('type', 'checkbox') collapseInput.setAttribute('type', 'checkbox')
wrapper.appendChild(collapseInput) wrapper.appendChild(collapseInput)
const allSiblings = Array.from(replyToContentElement.parentElement.children) if (forGmail) {
const replyToContentIndex = allSiblings.indexOf(replyToContentElement) const prevSibling = replyToContentElement.previousElementSibling
const followingSiblings = allSiblings.slice(replyToContentIndex + 1) if (prevSibling && prevSibling.tagName === 'BR') {
prevSibling.remove()
}
let cloned = replyToContentElement.cloneNode(true)
cloned.classList.remove('gmail_quote')
wrapper.appendChild(cloned)
} else {
const allSiblings = Array.from(replyToContentElement.parentElement.children)
const replyToContentIndex = allSiblings.indexOf(replyToContentElement)
const followingSiblings = allSiblings.slice(replyToContentIndex + 1)
let clonedFollowingSiblings = followingSiblings.map((sibling) => let clonedFollowingSiblings = followingSiblings.map((sibling) =>
sibling.cloneNode(true), sibling.cloneNode(true),
) )
const div = doc.createElement('div') const div = doc.createElement('div')
div.append(...clonedFollowingSiblings) div.append(...clonedFollowingSiblings)
wrapper.append(div) wrapper.append(div)
for (let i = replyToContentIndex + 1; i < allSiblings.length; i++) { for (let i = replyToContentIndex + 1; i < allSiblings.length; i++) {
replyToContentElement.parentElement.removeChild(allSiblings[i]) replyToContentElement.parentElement.removeChild(allSiblings[i])
}
} }
replyToContentElement.parentElement.replaceChild( replyToContentElement.parentElement.replaceChild(