Develop fill form (#11)

* feat(formRecognizer): 添加表单识别功能及相关组件

添加表单识别功能,包括以下内容:
1. 在路由配置中添加表单识别页面
2. 实现表单识别页面和侧边栏面板
3. 添加表单数据生成工具类
4. 实现与内容脚本的通信机制
5. 添加faker-js依赖用于生成测试数据
6. 支持不同入口点(popup/sidepanel)的组件渲染

* refactor(消息通信): 重构消息通信机制并集中管理消息协议

将分散的消息协议和通信逻辑集中到 utils/messages.ts 中
移除旧的 messages.tsx 文件并更新相关引用
添加消息动作枚举和类型定义,提高类型安全性
优化内容脚本注入失败时的处理逻辑

* feat(QR码): 添加粘贴图片功能并优化上传组件

添加全局粘贴事件监听,支持从剪贴板直接粘贴二维码图片进行解析。重构上传组件为独立组件QrCodeUploader,包含拖拽上传、预览、进度显示和错误处理功能。优化页面样式和用户体验。

- 在QrCodePage添加粘贴事件监听
- 创建QrCodeUploader组件整合上传功能
- 更新测试用例格式
- 调整多个页面的背景色样式

* feat(表单识别): 新增表单识别页面功能与模板管理

- 添加表单识别页面样式配置
- 实现表单字段扫描与展示功能
- 新增数据模板管理工具类
- 添加数据验证工具类
- 扩展表单识别页面功能,包括操作历史记录
- 支持模板的导入导出功能
- 优化表单填充操作的用户体验

* feat(消息系统): 添加标签页刷新功能

在消息系统中新增 RELOAD_TAB 动作类型和 tabId 字段,用于处理标签页刷新请求
修改 StorageCleanerPage 使用后台脚本发送刷新请求,确保弹窗关闭后仍能执行
在 background.ts 中添加标签页刷新处理逻辑,包括错误处理和响应返回

* refactor(theme): 重构主题颜色和样式配置

- 更新主题颜色以满足 WCAG AA 可访问性标准
- 提取全局样式配置到统一变量
- 使用语义化颜色变量替换硬编码值
- 为输入框样式创建统一配置

* feat: add URL entry management components and QR code generation feature

- Introduced `UrlEntryItem` and `UrlEntryList` components for displaying and managing URL entries.
- Added `UrlToQrCodeSection` component for generating QR codes from URLs with download and copy functionality.
- Implemented `AutoRefreshToggle`, `CleaningResult`, `DomainHeader`, `ErrorDisplay`, `OptionItem`, and `StorageOptionsGrid` components for enhanced user interface in storage cleaning.
- Created custom hooks `useStorageCleaner` and `useStorageState` for managing storage-related states and preferences.
- Added utility hook `useUrlPreferences` for handling URL entry preferences.

* feat: 新增时间戳转换器和相关组件,优化时间戳页面功能

* Refactor message handling and storage cleaning logic

* feat: 添加 GitHub Actions CI/CD 工作流,支持自动化构建与发布
This commit is contained in:
LingandRX
2026-04-23 13:57:55 +08:00
committed by GitHub
parent 0379f96e80
commit 4850c92365
44 changed files with 4168 additions and 2021 deletions
+123
View File
@@ -0,0 +1,123 @@
import React from 'react';
import {
Box,
Typography,
Paper,
List,
ListItem,
ListItemText,
ListItemIcon,
Collapse,
Chip,
} from '@mui/material';
import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
import ExpandLessIcon from '@mui/icons-material/ExpandLess';
import InputIcon from '@mui/icons-material/Input';
// 字段数据接口
interface FieldData {
id: string;
fieldType: string;
label: string | null;
placeholder: string;
name: string;
value: string;
isSelected: boolean;
generatedValue: string;
}
// 字段类型显示名称映射
const FIELD_TYPE_NAMES: Record<string, string> = {
text: '文本',
email: '邮箱',
phone: '手机号',
number: '数字',
date: '日期',
textarea: '文本域',
radio: '单选框',
checkbox: '复选框',
select: '下拉框',
password: '密码',
name: '姓名',
id_card: '身份证号',
unknown: '未知',
};
// 字段类型颜色映射
const FIELD_TYPE_COLORS: Record<
string,
'default' | 'primary' | 'secondary' | 'error' | 'success' | 'warning'
> = {
email: 'primary',
phone: 'success',
number: 'secondary',
date: 'warning',
password: 'error',
name: 'primary',
id_card: 'secondary',
text: 'default',
textarea: 'default',
unknown: 'default',
};
interface FieldListProps {
fields: FieldData[];
showFields: boolean;
onToggleShowFields: () => void;
}
const FieldList: React.FC<FieldListProps> = ({ fields, showFields, onToggleShowFields }) => {
if (fields.length === 0) return null;
return (
<Paper elevation={0} sx={{ borderRadius: 4, overflow: 'hidden', mb: 2 }}>
<Box
sx={{
borderBottom: 1,
borderColor: 'divider',
px: 2,
py: 1.5,
display: 'flex',
justifyContent: 'space-between',
alignItems: 'center',
cursor: 'pointer',
}}
onClick={onToggleShowFields}
>
<Typography variant="subtitle2" sx={{ fontWeight: 600 }}>
({fields.length})
</Typography>
{showFields ? <ExpandLessIcon /> : <ExpandMoreIcon />}
</Box>
<Collapse in={showFields}>
<List dense sx={{ maxHeight: 300, overflow: 'auto' }}>
{fields.map((field, index) => (
<ListItem key={field.id} sx={{ py: 0.5 }}>
<ListItemIcon sx={{ minWidth: 36 }}>
<InputIcon fontSize="small" color="action" />
</ListItemIcon>
<ListItemText
primary={
<Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
<Typography variant="body2" sx={{ fontWeight: 600 }}>
{field.label || field.name || field.placeholder || `字段 ${index + 1}`}
</Typography>
<Chip
label={FIELD_TYPE_NAMES[field.fieldType] || '未知'}
size="small"
color={FIELD_TYPE_COLORS[field.fieldType] || 'default'}
variant="outlined"
/>
</Box>
}
secondary={field.placeholder || field.name}
/>
</ListItem>
))}
</List>
</Collapse>
</Paper>
);
};
export default FieldList;