feat: 5项UX优化 - 合并占位符prompt、默认200x200尺寸、系统默认设置、签名状态列、素材预加载前置

This commit is contained in:
2026-04-17 19:59:19 +08:00
parent 5fee3352c1
commit ee1ac0d637
5 changed files with 117 additions and 18 deletions

View File

@@ -46,6 +46,21 @@ export default function Login() {
storage.set('formFieldsConfig', DEFAULT_FORM_FIELDS);
}
const savedAssets = storage.get<{id: string; name: string; dataUrl: string}[]>('imageAssets', []);
if (savedAssets.length === 0) {
fetch('/logo_square.png')
.then(res => res.blob())
.then(blob => {
const reader = new FileReader();
reader.onloadend = () => {
const dataUrl = reader.result as string;
storage.set('imageAssets', [{ id: 'asset_logo', name: '医院Logo', dataUrl }]);
};
reader.readAsDataURL(blob);
})
.catch(() => {});
}
const settingsRaw = storage.get<SystemSettings>('systemSettings', {} as SystemSettings);
if (!settingsRaw.frameCount) {
const round1 = (n: number) => Math.round(n * 10) / 10;
@@ -59,7 +74,10 @@ export default function Login() {
apiEndpoint: '',
apiKey: '',
defaultTemplate: savedTemplates[0]?.id || '',
frameMode: 'uniform'
frameMode: 'uniform',
autoInsertFrames: true,
autoInsertDelay: 1,
autoInsertFrameIndices: [0, 1, 2, 3, 4, 5]
};
storage.set('systemSettings', defaultSettings);
}

View File

@@ -422,15 +422,26 @@ export default function ReportEditor() {
const insertImage = () => {
editorRef.current?.focus();
const widthStr = prompt('请输入占位符最大宽度 (px)留空无限制:\n(提示正文一行文字高度约为 20 像素左右)', '');
const heightStr = prompt('请输入占位符最大高度 (px),留空无限制:', '');
const width = parseInt(widthStr || '0');
const height = parseInt(heightStr || '0');
const input = prompt('请输入占位符最大宽度和高度(px)用英文逗号分隔(如: 100,50。留空则默认宽高为 200*200。(提示: 正文一行文字高度约为 20 像素左右)', '');
if (input === null) return;
const parts = input.split(',').map(s => s.trim());
const widthStr = parts[0] || '';
const heightStr = parts[1] || '';
let styleStr = 'display:inline-flex;align-items:center;justify-content:center;border:1px dashed #cbd5e1;background:#f8fafc;vertical-align:middle;margin:0 4px;cursor:pointer;';
if (width > 0) styleStr += ` max-width:${width}px;`;
if (height > 0) styleStr += ` max-height:${height}px;`;
if (!width && !height) styleStr += ' padding:8px 16px;';
let width = parseInt(widthStr) || 0;
let height = parseInt(heightStr) || 0;
if (!widthStr && !heightStr) {
width = 200;
height = 200;
} else if (widthStr && !heightStr) {
height = 200;
} else if (!widthStr && heightStr) {
width = 200;
}
let styleStr = 'display:inline-flex;align-items:center;justify-content:center;border:1px dashed #cbd5e1;background:#f8fafc;vertical-align:middle;margin:0 4px;cursor:pointer;overflow:hidden;';
if (width > 0) styleStr += `width:${width}px;`;
if (height > 0) styleStr += `height:${height}px;`;
const showShortText = width > 0 && width < 80;
const hintText = showShortText ? '插入图片' : '插入/点击放置图片';

View File

@@ -486,18 +486,29 @@ export default function TemplateManage() {
const insertImage = () => {
editorRef.current?.focus();
restoreSelection();
const widthStr = prompt('请输入占位符最大宽度 (px)留空无限制:\n(提示正文一行文字高度约为 20 像素左右)', '');
const heightStr = prompt('请输入占位符最大高度 (px),留空无限制:', '');
const width = parseInt(widthStr || '0');
const height = parseInt(heightStr || '0');
const input = prompt('请输入占位符最大宽度和高度(px)用英文逗号分隔(如: 100,50。留空则默认宽高为 200*200。(提示: 正文一行文字高度约为 20 像素左右)', '');
if (input === null) return;
const parts = input.split(',').map(s => s.trim());
const widthStr = parts[0] || '';
const heightStr = parts[1] || '';
let styleStr = 'display:inline-flex;align-items:center;justify-content:center;border:1px dashed #cbd5e1;background:#f8fafc;vertical-align:middle;margin:0 4px;cursor:pointer;';
if (width > 0) styleStr += ` max-width:${width}px;`;
if (height > 0) styleStr += ` max-height:${height}px;`;
if (!width && !height) styleStr += ' padding:8px 16px;';
let width = parseInt(widthStr) || 0;
let height = parseInt(heightStr) || 0;
if (!widthStr && !heightStr) {
width = 200;
height = 200;
} else if (widthStr && !heightStr) {
height = 200;
} else if (!widthStr && heightStr) {
width = 200;
}
let styleStr = 'display:inline-flex;align-items:center;justify-content:center;border:1px dashed #cbd5e1;background:#f8fafc;vertical-align:middle;margin:0 4px;cursor:pointer;overflow:hidden;';
if (width > 0) styleStr += `width:${width}px;`;
if (height > 0) styleStr += `height:${height}px;`;
const showShortText = width > 0 && width < 80;
const hintText = showShortText ? '插入图片' : '插入/点击放置图片';
const hintText = showShortText ? '插' : '插入/点击放置图片';
const id = 'ph_' + Date.now();
const html = `<span id="${id}" class="image-placeholder" data-placeholder="true" contenteditable="false" style="${styleStr}"><span class="delete-btn" contenteditable="false">×</span><span class="placeholder-text" style="color:#94a3b8;font-size:11px;pointer-events:none;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;">${hintText}</span></span>&#8203;`;

View File

@@ -416,6 +416,7 @@ export default function UserManage() {
<th className="px-6 py-4 text-left text-[11px] font-bold text-text-muted uppercase tracking-wider border-b border-border"></th>
<th className="px-6 py-4 text-left text-[11px] font-bold text-text-muted uppercase tracking-wider border-b border-border"></th>
<th className="px-6 py-4 text-left text-[11px] font-bold text-text-muted uppercase tracking-wider border-b border-border"></th>
<th className="px-6 py-4 text-left text-[11px] font-bold text-text-muted uppercase tracking-wider border-b border-border"></th>
<th className="px-6 py-4 text-left text-[11px] font-bold text-text-muted uppercase tracking-wider border-b border-border"></th>
<th className="px-6 py-4 text-left text-[11px] font-bold text-text-muted uppercase tracking-wider border-b border-border"></th>
</tr>
@@ -437,6 +438,13 @@ export default function UserManage() {
</span>
</td>
<td className="px-6 py-4 text-sm text-text-main">{user.department || '-'}</td>
<td className="px-6 py-4">
<span className={`inline-block px-2.5 py-1 rounded-full text-[11px] font-bold ${
user.signature ? 'bg-blue-100 text-blue-700' : 'bg-slate-100 text-slate-500'
}`}>
{user.signature ? '已上传' : '未上传'}
</span>
</td>
<td className="px-6 py-4">
<span className={`inline-block px-2.5 py-1 rounded-full text-[11px] font-bold ${
user.status === 'active' ? 'bg-green-100 text-green-700' : 'bg-red-100 text-red-700'