master
2358328281@qq.com 1 month ago
parent 98f77a9818
commit 26449fbea5

@ -602,7 +602,7 @@ const viewReport = async (filePath) => {
.history-list {
min-height: 80px;
max-height: 200px;
max-height: 240px;
overflow-y: auto;
.history-items {

@ -227,6 +227,20 @@ const form = reactive({
const MAX_FILE_SIZE = 50 * 1024 * 1024;
const MAX_PASTE_IMAGE_SIZE = 5 * 1024 * 1024;
// FileReader/ abort
// onload editor dangerouslyInsertHtml Vue 3.5 patch
const pendingPasteReaders = new Set();
const cancelPendingPasteReaders = () => {
for (const r of pendingPasteReaders) {
try {
r.abort();
} catch (_) {
/* ignore */
}
}
pendingPasteReaders.clear();
};
const handleAttachmentChange = (file) => {
if (file?.size > MAX_FILE_SIZE) {
ElMessage.warning('文件不能超过 50MB');
@ -373,7 +387,9 @@ const handleEditorPasteImage = (editor, event) => {
return;
}
const reader = new FileReader();
pendingPasteReaders.add(reader);
reader.onload = (e) => {
pendingPasteReaders.delete(reader);
const dataUrl = e.target?.result;
if (!dataUrl) {
ElMessage.error('图片读取失败');
@ -382,17 +398,37 @@ const handleEditorPasteImage = (editor, event) => {
try {
if (savedSelection) editor.select(savedSelection);
} catch (_) {
try {
if (typeof editor.focus === 'function') editor.focus();
} catch (__) {
/* editor 已销毁 */
}
}
// editor /insertHtml
try {
if (typeof editor.focus === 'function') editor.focus();
editor.dangerouslyInsertHtml(
`<img src="${dataUrl}" style="max-width:100%;height:auto;" />`,
);
if (typeof editor.updateView === 'function') editor.updateView();
// form.descriptiondangerouslyInsertHtml editor Slate API
// v-model wangEditor setHtml Slate operations
// ( [0, 2]) "Cannot find a descendant path"
// v-model editor.getHtml()
} catch (err) {
console.warn(
'[OrderFormDialog] 粘贴图片插入失败editor 可能已销毁):',
err?.message,
);
}
if (typeof editor.focus === 'function') editor.focus();
editor.dangerouslyInsertHtml(
`<img src="${dataUrl}" style="max-width:100%;height:auto;" />`,
);
if (typeof editor.updateView === 'function') editor.updateView();
};
reader.onerror = () => {
pendingPasteReaders.delete(reader);
ElMessage.error('图片处理失败');
};
reader.onabort = () => {
pendingPasteReaders.delete(reader);
};
reader.readAsDataURL(file);
});
return false;
@ -414,6 +450,19 @@ const handleEditorCreated = (editor) => {
};
const resetForm = () => {
// wangEditor Slate selection
// paste editor v-show
// setHtml Slate selection
const editor = editorRef.value;
if (editor) {
try {
if (typeof editor.setHtml === 'function') {
editor.setHtml('');
}
} catch (_) {
/* editor 已销毁或不可用 */
}
}
Object.assign(form, {
hospitalId: undefined,
title: '',
@ -485,6 +534,8 @@ watch(
const closeDialog = () => emit('update:modelValue', false);
const onClosed = () => {
// abort FileReader onload 访 editor
cancelPendingPasteReaders();
resetForm();
emit('closed');
};
@ -493,6 +544,13 @@ const onSubmit = async () => {
// dept / submitter ""
form.department = (form.department || '').trim();
form.submitter = (form.submitter || '').trim();
// wangEditor form.description
// dangerouslyInsertHtml editor v-model
// form.description getHtml()
const editor = editorRef.value;
if (editor && typeof editor.getHtml === 'function') {
form.description = editor.getHtml() || '';
}
await formRef.value.validate(async (valid) => {
if (!valid) return;
const formData = new FormData();
@ -521,6 +579,7 @@ const removePasteListener = () => {
};
onBeforeUnmount(() => {
cancelPendingPasteReaders();
removePasteListener();
pasteHandlerRef = null;
const editor = editorRef.value;

@ -91,7 +91,7 @@
<el-table class="order-table" :data="list" v-loading="loading" stripe
header-cell-class-name="order-table-header-cell">
<el-table-column :label="$t('table.id')" prop="orderNo" width="160" />
<el-table-column :label="$t('table.id')" prop="orderNo" width="90" show-overflow-tooltip />
<el-table-column :label="$t('table.hospital')" prop="hospitalName" min-width="160" show-overflow-tooltip />
<el-table-column :label="$t('table.priority')" width="90">
<template #default="{ row }">
@ -151,7 +151,7 @@
<!-- 快速提交工单 弹窗复用公共 OrderFormDialogmode='create' -->
<OrderFormDialog v-model="quickVisible" mode="create" :hospitals="hospitals" :submitting="quickSubmitting"
@submit="onQuickSubmit" />
@submit="onQuickSubmit" @closed="console.log('close')" />
<!-- 工单详情 弹窗 -->
<OrderDetailDialog v-model="detailVisible" :order-id="currentOrderId" @updated="loadList" />

@ -66,7 +66,7 @@
</div> -->
<el-table class="admin-table" :data="list" v-loading="loading" stripe
header-cell-class-name="admin-table-header-cell">
<el-table-column :label="$t('table.id')" prop="orderNo" width="160" />
<el-table-column :label="$t('table.id')" prop="orderNo" width="90" show-overflow-tooltip />
<el-table-column :label="$t('table.priority')" width="90">
<template #default="{ row }">
<div class="priority-row" :class="priorityClass(row.priority)">{{ row.priority }}</div>

Loading…
Cancel
Save