| | |
| | | size="small" |
| | | min-height="40px" |
| | | :row-config="{ isCurrent: true, isHover: true }" |
| | | :menu-config="tableMenu" |
| | | @menu-click="contextMenuClickEvent" |
| | | :menu-config="{ enabled: true }" |
| | | @cell-click="cellClickEvent" |
| | | @checkbox-change="selectChangeEvent" |
| | | @cell-menu="onCellContextMenu" |
| | | > |
| | | <vxe-column type="checkbox" width="30"></vxe-column> |
| | | <vxe-column field="sender" title="发件人" data-index="sender" min-width="300px"> |
| | |
| | | <a-button type="link" size="small">往来邮件</a-button></div |
| | | > |
| | | </template> |
| | | <div class="title-dot" :class="fnIsItHighlighted(row) ? 'title-dot-color' : ''"> |
| | | <div :class="fnIsItHighlighted(row) ? 'title-dot-color' : ''"> |
| | | <span style="font-weight: 700">{{ row.senderName }}</span |
| | | ><span style="padding: 0 8px">|</span> |
| | | <span style="font-weight: 500">{{ row.sender }}</span> |
| | |
| | | </div> |
| | | </template> |
| | | </vxe-column> |
| | | <vxe-column |
| | | show-overflow |
| | | field="icon" |
| | | title="表题" |
| | | data-index="icon" |
| | | width="100" |
| | | align="right" |
| | | > |
| | | <template #default="{ row }"> |
| | | <a-tooltip placement="bottom"> |
| | | <template #title> |
| | | <span>有附件</span> |
| | | </template> |
| | | <span v-show="row.attachmentList?.length > 0"> |
| | | <PaperClipOutlined /> |
| | | </span> |
| | | </a-tooltip> |
| | | </template> |
| | | </vxe-column> |
| | | |
| | | <vxe-column |
| | | show-overflow |
| | | field="subject" |
| | |
| | | <span style="display: flex; justify-content: space-around"> |
| | | <span>{{ |
| | | row.mailType !== 0 |
| | | ? formatToDateDay(row.receiveTime) |
| | | ? formatToDateDay(row.receiveTime || row.createTime) |
| | | : formatToDateDay(row.createTime) |
| | | }}</span> |
| | | |
| | |
| | | </span> |
| | | </template> |
| | | </vxe-column> |
| | | </vxe-table> </div |
| | | </vxe-table> |
| | | <ContextMenu |
| | | v-if="showMenu" |
| | | :style="menuStyle" |
| | | :selected-cell="selectedCell" |
| | | @close-menu="showMenu = false" |
| | | /> </div |
| | | ></div> |
| | | |
| | | <div v-else style="display: flex; align-items: center; justify-content: center; height: 70vh"> |
| | |
| | | PushpinOutlined, |
| | | CopyOutlined, |
| | | DownOutlined, |
| | | PaperClipOutlined, |
| | | } from '@ant-design/icons-vue'; |
| | | |
| | | import { ref, watch, defineProps, defineEmits, computed, defineExpose, inject } from 'vue'; |
| | |
| | | } |
| | | |
| | | // 右键菜单 |
| | | const tableMenu = { |
| | | className: 'my-menus', |
| | | body: { |
| | | options: [ |
| | | [ |
| | | { |
| | | code: 'reply', |
| | | name: '回复', |
| | | }, |
| | | { code: 'replyAll', name: '回复全部' }, |
| | | { code: 'replyWithAttachment', name: '带附件回复' }, |
| | | { code: 'replyAllWithAttachment', name: '带附件回复全部' }, |
| | | { code: 'forward', name: '转发' }, |
| | | { code: 'forwardAsAttachment', name: '作为附件转发' }, |
| | | { code: 'distribute', name: '分发' }, |
| | | { code: 'setRemark', name: '设置备注' }, |
| | | ], |
| | | [ |
| | | { code: 'toHandle', name: '待处理' }, |
| | | { code: 'markAsUnread', name: '标为未读' }, |
| | | { code: 'labelAs', name: '标注为' }, |
| | | ], |
| | | [ |
| | | { code: 'newRule', name: '新建收发件规则' }, |
| | | { code: 'moveTo', name: '移动到' }, |
| | | ], |
| | | [ |
| | | { code: 'exportEmail', name: '导出邮件' }, |
| | | { code: 'createFollowUp', name: '建为客户跟进' }, |
| | | { code: 'createSchedule', name: '新建日程' }, |
| | | ], |
| | | [ |
| | | { code: 'markAsSpam', name: '标为垃圾邮件' }, |
| | | { code: 'delete', name: '删除' }, |
| | | ], |
| | | ], |
| | | }, |
| | | import ContextMenu from '@/views/email/components/ContextMenu/index.vue'; |
| | | const showMenu = ref(false); |
| | | const menuStyle = ref({}); |
| | | const selectedCell = ref(null); |
| | | const onCellContextMenu = ({ |
| | | type, |
| | | row, |
| | | rowIndex, |
| | | $rowIndex, |
| | | column, |
| | | columnIndex, |
| | | $columnIndex, |
| | | $event, |
| | | }) => { |
| | | $event.preventDefault(); // 阻止默认的浏览器右键菜单? |
| | | selectedCell.value = { row, column, columnIndex }; // 保存当前选中的单元格数据 |
| | | |
| | | // 计算菜单初始位置 |
| | | let menuX = $event.clientX; |
| | | let menuY = $event.clientY; |
| | | |
| | | // 获取菜单的宽度和高度 |
| | | const menuWidth = 200; // 假设菜单宽度为200px,可以根据实际情况调整 |
| | | const menuHeight = 800; // 假设菜单高度为150px,可以根据实际情况调整 |
| | | // 获取窗口宽度和高度 |
| | | const windowWidth = window.innerWidth; |
| | | const windowHeight = window.innerHeight; |
| | | |
| | | // 检查菜单是否超出窗口的右边界,如果是,则向左调整 |
| | | if (menuX + menuWidth > windowWidth) { |
| | | menuX = windowWidth - menuWidth; |
| | | } |
| | | |
| | | // 检查菜单是否超出窗口的下边界,如果是,则向上调整 |
| | | if (menuY + menuHeight > windowHeight) { |
| | | menuY = windowHeight - menuHeight; |
| | | } |
| | | menuStyle.value = { |
| | | position: 'fixed', |
| | | top: `${menuY}px`, |
| | | left: `${menuX}px`, |
| | | }; |
| | | showMenu.value = true; |
| | | }; |
| | | |
| | | function contextMenuClickEvent({ menu, row, column }) { |
| | | switch (menu.code) { |
| | | case 'copy': |
| | | if (row && column) { |
| | | } |
| | | break; |
| | | default: |
| | | } |
| | | } |
| | | // 监听全局点击事件,点击页面其他地方关闭菜单 |
| | | document.addEventListener('click', () => { |
| | | showMenu.value = false; |
| | | }); |
| | | |
| | | const vxeTableRef = ref(); |
| | | function fnIsItHighlighted(row) { |
| | | return row.readFlag && props.isDrafts; |
| | | if (props.isDrafts) { |
| | | return row.readFlag && props.isDrafts; |
| | | } else { |
| | | return row.readFlag; |
| | | } |
| | | } |
| | | function fnSelectAll(is) { |
| | | try { |
| | |
| | | |
| | | .span-title { |
| | | width: 100%; |
| | | height: 30px; |
| | | padding: 5px; |
| | | color: #000; |
| | | font-weight: 700; |
| | | line-height: 30px; |
| | | text-align: left; |
| | | } |
| | | |