feat: 6项交互优化 - placeholder虚线框清除、删除按钮遮挡修复、*分隔输入、签名尺寸固定、移除isSigned、多选文本拼接重构

This commit is contained in:
2026-04-17 20:46:58 +08:00
parent ee1ac0d637
commit 28b913692c
5 changed files with 149 additions and 58 deletions

View File

@@ -289,6 +289,69 @@ if ((settings.autoInsertDelay || 0) > 0) {
---
## 记录 136 项交互优化placeholder 虚线框、删除按钮、签名尺寸、多选重构)
**A. 具体问题**
用户提出 6 个 UI/UX 改进需求:
1. 图片插入占位符后虚线框残留——内联 `border:1px dashed #cbd5e1` 优先级高于 `.has-image` CSS class
2. `insertImage` 生成的 placeholder 中 `overflow:hidden` 裁切了绝对定位的删除按钮(`×`
3. 占位符尺寸输入从逗号分隔改为星号(`*`)分隔,格式错误时提示重新输入;
4. 默认模板中「手术者签名」占位符固定为 `200×40px`
5. 删除「手术者签名确认」字段及相关的弱阻断确认弹窗;
6. 多选组件从 tag 形态重构为纯文本拼接形态,支持多种标点符号拆分并自动保存新选项。
**B. 产生问题原因**
1. `fillPlaceholderSrc` 仅添加了 `has-image` class但内联 `style="border:..."` 的优先级永远高于外部 CSS导致虚线框无法消除。
2. `insertImage` 的 `styleStr` 中硬编码了 `overflow:hidden;`,而删除按钮使用 `position:absolute; top:-8px; right:-8px` 之类的定位,必然被父级裁切。
3. 英文逗号分隔容易与用户输入的千位分隔符或中文逗号混淆。
4. 默认模板中签名占位符使用 `min-width:80px;min-height:24px`,尺寸过小且不一致。
5. `isSigned` 字段与签名图片是两个独立的状态,造成医生需要多点一次确认,流程冗余。
6. 原多选使用 tag 胶囊形式,每个 tag 带背景色和删除按钮,占用空间大,且无法直接复制粘贴整段文本。
**C. 解决问题方案**
1. **清除内联样式**:在 `ReportEditor.tsx` 和 `TemplateManage.tsx` 的 `fillPlaceholderSrc` 中增加:
```ts
placeholder.style.border = 'none';
placeholder.style.background = 'transparent';
```
同时统一 `defaultContent.ts` 中所有 8 个 placeholder 为 `<span style="display:inline-flex;...">` 格式,表格中的 6 个也统一使用 `width:100%;height:150px;`。
2. **移除 overflow:hidden**:从两个 `insertImage` 的 `styleStr` 中删除 `overflow:hidden;`,保留在 `placeholder-text` 子元素上(文字截断仍可用)。
3. **星号分隔 + 校验循环**
```ts
while (true) {
const input = prompt('...用 * 分隔...', '');
if (input === null) return;
const trimmed = input.trim();
if (trimmed === '') break;
const parts = trimmed.split('*').map(s => s.trim());
if (parts.length === 2 && /^\d+$/.test(parts[0]) && /^\d+$/.test(parts[1])) {
width = parseInt(parts[0]); height = parseInt(parts[1]); break;
}
alert('格式错误...');
}
```
4. **签名占位符尺寸**`defaultContent.ts` 中改为 `width:200px;height:40px;`。
5. **移除 `isSigned`**
- `types.ts` 的 `DEFAULT_FORM_FIELDS` 中删除;
- `ReportEditor.tsx` 的初始 `reportData` 中删除;
- `saveReport` 的完成确认逻辑中删除 `isSigned` 判断;
- smart field 同步逻辑中删除 `isSigned` 判断,只要有 `signatureData` 就直接显示签名图。
6. **多选重构为文本拼接**
- `displayText = currentValues.join(', ')`
- input 使用 `value={displayText}` 受控组件;
- `onChange` 实时解析并更新 `reportData``parseMultiInput(text)` 用 `/[,;;、]/` 正则拆分、去重;
- `onBlur` / `Enter` 时调用 `handleMultiCommit`,将拆分出的新选项保存到 `multiSelectOptions` 和 `formFieldsConfig`
- 下拉选择时追加 `, opt` 到现有文本。
**D. 后续如何避免问题**
- 当使用内联样式设置边框/背景时,如需在特定状态下移除,**必须在内联层面重置**`style.border = 'none'`),不能仅依赖 CSS class 覆盖。
- `overflow:hidden` 与绝对定位子元素互斥,若需要裁切文字但保留溢出按钮,应将 `overflow:hidden` 限制在文字子元素上,而非父容器。
- 用户输入的格式校验应使用 `while` 循环 + `alert` 重试,避免静默容错导致不可预期的行为。
- 删除字段时务必全局搜索(`grep -r 'isSigned'`),确保初始化状态、表单验证、模板绑定等所有引用点都被清理。
- 将「标签胶囊」改为「纯文本拼接」时,注意保持 `reportData` 的数据结构仍为数组UI 层只做 `join/split` 转换。
---
## 记录 11关键帧在路由切换后丢失——压缩 Canvas 分辨率并增加存储错误日志
**A. 具体问题**