feat: 6项交互优化 - placeholder虚线框清除、删除按钮遮挡修复、*分隔输入、签名尺寸固定、移除isSigned、多选文本拼接重构
This commit is contained in:
63
过往经验/经验记录.md
63
过往经验/经验记录.md
@@ -289,6 +289,69 @@ if ((settings.autoInsertDelay || 0) > 0) {
|
||||
|
||||
---
|
||||
|
||||
## 记录 13:6 项交互优化(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. 具体问题**
|
||||
|
||||
Reference in New Issue
Block a user