vue-files-preview-inno
Version:
A tool for previewing files such as doc, excel, pdf, image, markdown, txt, audio, and video and so on.
1 lines • 8.75 kB
Source Map (JSON)
{"version":3,"file":"index.vue2.mjs","sources":["../../../../../../packages/preview/supports/msg-preview/index.vue"],"sourcesContent":["<script lang='ts' setup>\nimport {ref, watch} from 'vue'\nimport MsgReader from '@kenjiuno/msgreader'\nimport type {FieldsData} from '@kenjiuno/msgreader'\nimport type {PreviewProps} from '../../preview.interface'\nimport {getFileRenderByFile, getFileRenderByUrl} from '../../utils/utils'\n\nconst props = withDefaults(\n defineProps<PreviewProps>(),\n {\n url: () => null,\n file: () => null,\n },\n)\nconst emit = defineEmits<{\n rendered: []\n error: [error: Error]\n}>()\n\nconst msgData = ref<FieldsData | null>(null)\n\nfunction parseMsgBuffer(buffer: ArrayBuffer): void {\n try {\n const reader = new MsgReader(buffer)\n msgData.value = reader.getFileData()\n emit('rendered')\n } catch (e) {\n emit('error', e instanceof Error ? e : new Error('Failed to parse MSG file'))\n }\n}\n\nwatch(\n () => props.file,\n (file) => {\n if (file) {\n getFileRenderByFile(file).then((render) => {\n parseMsgBuffer(render as ArrayBuffer)\n }).catch((e: Error) => {\n emit('error', e)\n })\n }\n },\n {immediate: true},\n)\n\nwatch(\n () => props.url,\n (url) => {\n if (url && !props.file) {\n getFileRenderByUrl(url).then((render) => {\n parseMsgBuffer(render as ArrayBuffer)\n }).catch((e: Error) => {\n emit('error', e)\n })\n }\n },\n {immediate: true},\n)\n\nfunction formatRecipients(recipients?: FieldsData[]): string {\n if (!recipients || recipients.length === 0) return ''\n return recipients.map(r => {\n const name = r.name || ''\n const email = r.email || r.smtpAddress || ''\n if (name && email) return `${name} <${email}>`\n return name || email\n }).join('; ')\n}\n\nfunction formatDate(dateStr?: string): string {\n if (!dateStr) return ''\n try {\n const date = new Date(dateStr)\n return date.toLocaleString()\n } catch {\n return dateStr\n }\n}\n</script>\n\n<template>\n <div v-if=\"msgData\" class=\"msg-preview\">\n <div class=\"msg-header\">\n <h2 class=\"msg-subject\">{{ msgData.subject || '(No Subject)' }}</h2>\n <div class=\"msg-meta\">\n <div v-if=\"msgData.senderName || msgData.senderEmail\" class=\"msg-field\">\n <span class=\"msg-label\">From</span>\n <span class=\"msg-value\">\n {{ msgData.senderName }}\n <span v-if=\"msgData.senderEmail\" class=\"msg-email\"><{{ msgData.senderEmail }}></span>\n </span>\n </div>\n <div v-if=\"msgData.recipients && msgData.recipients.length\" class=\"msg-field\">\n <span class=\"msg-label\">To</span>\n <span class=\"msg-value\">{{ formatRecipients(msgData.recipients) }}</span>\n </div>\n <div v-if=\"msgData.clientSubmitTime || msgData.messageDeliveryTime\" class=\"msg-field\">\n <span class=\"msg-label\">Date</span>\n <span class=\"msg-value\">{{ formatDate(msgData.clientSubmitTime || msgData.messageDeliveryTime) }}</span>\n </div>\n <div v-if=\"msgData.attachments && msgData.attachments.length\" class=\"msg-field\">\n <span class=\"msg-label\">Attachments</span>\n <span class=\"msg-value msg-attachments\">\n <span v-for=\"(att, i) in msgData.attachments\" :key=\"i\" class=\"msg-attachment-tag\">\n {{ att.fileName || att.name || 'attachment' }}\n </span>\n </span>\n </div>\n </div>\n </div>\n <div class=\"msg-body\">\n <div v-if=\"msgData.bodyHtml\" class=\"msg-body-html\" v-html=\"msgData.bodyHtml\" />\n <pre v-else-if=\"msgData.body\" class=\"msg-body-text\">{{ msgData.body }}</pre>\n <div v-else class=\"msg-body-empty\">No content</div>\n </div>\n </div>\n</template>\n\n<style scoped lang='scss'>\n.msg-preview {\n width: 100%;\n height: 100%;\n overflow: auto;\n background: #fff;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n color: #333;\n}\n\n.msg-header {\n padding: 24px 24px 16px;\n border-bottom: 1px solid #e8ecf0;\n}\n\n.msg-subject {\n margin: 0 0 16px;\n font-size: 20px;\n font-weight: 600;\n color: #1a1a1a;\n line-height: 1.4;\n}\n\n.msg-meta {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.msg-field {\n display: flex;\n align-items: baseline;\n gap: 12px;\n font-size: 14px;\n line-height: 1.5;\n}\n\n.msg-label {\n flex-shrink: 0;\n min-width: 80px;\n color: #8b9dc3;\n font-weight: 500;\n}\n\n.msg-value {\n color: #333;\n word-break: break-word;\n}\n\n.msg-email {\n color: #667eea;\n}\n\n.msg-attachments {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.msg-attachment-tag {\n display: inline-block;\n padding: 2px 10px;\n background: #f0f4ff;\n border-radius: 4px;\n font-size: 12px;\n color: #667eea;\n}\n\n.msg-body {\n padding: 24px;\n}\n\n.msg-body-html {\n line-height: 1.6;\n word-break: break-word;\n}\n\n.msg-body-text {\n margin: 0;\n white-space: pre-wrap;\n word-break: break-word;\n font-family: inherit;\n font-size: 14px;\n line-height: 1.6;\n}\n\n.msg-body-empty {\n color: #999;\n font-style: italic;\n text-align: center;\n padding: 40px 0;\n}\n</style>"],"names":["props","__props","emit","__emit","msgData","ref","parseMsgBuffer","buffer","reader","MsgReader","watch","file","getFileRenderByFile","render","url","getFileRenderByUrl","formatRecipients","recipients","r","name","email","formatDate","dateStr","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_hoisted_3","_toDisplayString","_hoisted_4","_hoisted_5","_cache","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_Fragment","att","i","_hoisted_14","_hoisted_16","_hoisted_17"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,UAAMA,IAAQC,GAORC,IAAOC,GAKPC,IAAUC,EAAuB,IAAI;AAE3C,aAASC,EAAeC,GAA2B;AACjD,UAAI;AACF,cAAMC,IAAS,IAAIC,EAAUF,CAAM;AACnC,QAAAH,EAAQ,QAAQI,EAAO,YAAA,GACvBN,EAAK,UAAU;AAAA,MACjB,SAAS,GAAG;AACV,QAAAA,EAAK,SAAS,aAAa,QAAQ,IAAI,IAAI,MAAM,0BAA0B,CAAC;AAAA,MAC9E;AAAA,IACF;AAEA,IAAAQ;AAAA,MACE,MAAMV,EAAM;AAAA,MACZ,CAACW,MAAS;AACR,QAAIA,KACFC,EAAoBD,CAAI,EAAE,KAAK,CAACE,MAAW;AACzC,UAAAP,EAAeO,CAAqB;AAAA,QACtC,CAAC,EAAE,MAAM,CAAC,MAAa;AACrB,UAAAX,EAAK,SAAS,CAAC;AAAA,QACjB,CAAC;AAAA,MAEL;AAAA,MACA,EAAC,WAAW,GAAA;AAAA,IAAI,GAGlBQ;AAAA,MACE,MAAMV,EAAM;AAAA,MACZ,CAACc,MAAQ;AACP,QAAIA,KAAO,CAACd,EAAM,QAChBe,EAAmBD,CAAG,EAAE,KAAK,CAACD,MAAW;AACvC,UAAAP,EAAeO,CAAqB;AAAA,QACtC,CAAC,EAAE,MAAM,CAAC,MAAa;AACrB,UAAAX,EAAK,SAAS,CAAC;AAAA,QACjB,CAAC;AAAA,MAEL;AAAA,MACA,EAAC,WAAW,GAAA;AAAA,IAAI;AAGlB,aAASc,EAAiBC,GAAmC;AAC3D,aAAI,CAACA,KAAcA,EAAW,WAAW,IAAU,KAC5CA,EAAW,IAAI,CAAAC,MAAK;AACzB,cAAMC,IAAOD,EAAE,QAAQ,IACjBE,IAAQF,EAAE,SAASA,EAAE,eAAe;AAC1C,eAAIC,KAAQC,IAAc,GAAGD,CAAI,KAAKC,CAAK,MACpCD,KAAQC;AAAA,MACjB,CAAC,EAAE,KAAK,IAAI;AAAA,IACd;AAEA,aAASC,EAAWC,GAA0B;AAC5C,UAAI,CAACA,EAAS,QAAO;AACrB,UAAI;AAEF,eADa,IAAI,KAAKA,CAAO,EACjB,eAAA;AAAA,MACd,QAAQ;AACN,eAAOA;AAAA,MACT;AAAA,IACF;qBAIalB,EAAA,SAAXmB,EAAA,GAAAC,EAkCM,OAlCNC,GAkCM;AAAA,MAjCJC,EA2BM,OA3BNC,GA2BM;AAAA,QA1BJD,EAAoE,MAApEE,GAAoEC,EAAzCzB,EAAA,MAAQ,WAAO,cAAA,GAAA,CAAA;AAAA,QAC1CsB,EAwBM,OAxBNI,GAwBM;AAAA,UAvBO1B,EAAA,MAAQ,cAAcA,EAAA,MAAQ,eAAzCmB,KAAAC,EAMM,OANNO,GAMM;AAAA,YALJC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAAN,EAAmC,QAAA,EAA7B,OAAM,YAAA,GAAY,QAAI,EAAA;AAAA,YAC5BA,EAGO,QAHPO,GAGO;AAAA,kBAFF7B,EAAA,MAAQ,UAAU,IAAG,KACxB,CAAA;AAAA,cAAYA,EAAA,MAAQ,oBAApBoB,EAA2F,QAA3FU,GAAmD,QAAO9B,EAAA,MAAQ,WAAW,IAAG,KAAI,CAAA;;;UAG7EA,EAAA,MAAQ,cAAcA,QAAQ,WAAW,UAApDmB,EAAA,GAAAC,EAGM,OAHNW,GAGM;AAAA,YAFJH,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAAN,EAAiC,QAAA,EAA3B,OAAM,YAAA,GAAY,MAAE,EAAA;AAAA,YAC1BA,EAAyE,QAAzEU,GAAyEP,EAA9Cb,EAAiBZ,EAAA,MAAQ,UAAU,CAAA,GAAA,CAAA;AAAA,UAAA;UAErDA,EAAA,MAAQ,oBAAoBA,EAAA,MAAQ,uBAA/CmB,KAAAC,EAGM,OAHNa,GAGM;AAAA,YAFJL,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAAN,EAAmC,QAAA,EAA7B,OAAM,YAAA,GAAY,QAAI,EAAA;AAAA,YAC5BA,EAAwG,QAAxGY,GAAwGT,EAA7ER,EAAWjB,EAAA,MAAQ,oBAAoBA,EAAA,MAAQ,mBAAmB,CAAA,GAAA,CAAA;AAAA,UAAA;UAEpFA,EAAA,MAAQ,eAAeA,QAAQ,YAAY,UAAtDmB,EAAA,GAAAC,EAOM,OAPNe,GAOM;AAAA,YANJP,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAAN,EAA0C,QAAA,EAApC,OAAM,YAAA,GAAY,eAAW,EAAA;AAAA,YACnCA,EAIO,QAJPc,GAIO;AAAA,eAHLjB,EAAA,EAAA,GAAAC,EAEOiB,WAFkBrC,EAAA,MAAQ,aAAW,CAA9BsC,GAAKC,YAAnBnB,EAEO,QAAA;AAAA,gBAFwC,KAAKmB;AAAA,gBAAG,OAAM;AAAA,cAAA,GACxDd,EAAAa,EAAI,YAAYA,EAAI,QAAI,YAAA,GAAA,CAAA;;;;;MAMrChB,EAIM,OAJNkB,GAIM;AAAA,QAHOxC,EAAA,MAAQ,iBAAnBoB,EAA+E,OAAA;AAAA;UAAlD,OAAM;AAAA,UAAgB,WAAQpB,EAAA,MAAQ;AAAA,QAAA,kBACnDA,EAAA,MAAQ,QAAxBmB,EAAA,GAAAC,EAA4E,OAA5EqB,GAA4EhB,EAArBzB,EAAA,MAAQ,IAAI,GAAA,CAAA,WACnEoB,EAAmD,OAAnDsB,GAAmC,YAAU;AAAA,MAAA;;;;"}