c039475119
* docs: 添加组件文档注释和类型导入 refactor: 统一使用 SnackbarOptions 类型 style: 优化导入语句顺序和格式 * refactor: 简化假数据生成器中的faker导入和使用 Co-authored-by: Copilot <copilot@github.com> * feat(form-recognizer): 增强表单识别功能并优化UI交互 - 新增字段类型偏好设置功能,支持按域名保存字段类型 - 重构FieldList组件,改进字段选择和类型修改体验 - 添加字段定位闪烁功能,便于在页面上快速找到对应字段 - 优化表单填充逻辑,支持单个字段覆盖默认填充模式 - 移除独立的侧边栏页面,统一使用主页面组件 - 改进useStorageState钩子,增加加载状态管理和防抖处理 * refactor: 移除未使用的组件文件 * refactor(页面头部): 提取通用 PageHeader 组件并替换各页面头部实现 重构各页面头部为统一的 PageHeader 组件,提高代码复用性和维护性 * style(组件): 调整自动刷新开关和存储选项网格的样式 优化自动刷新开关的文本内边距,重构存储选项网格的布局结构,调整间距和边框样式 * style(ui): 调整时间戳页面和结果视图的样式 - 为时区选择器添加圆角 - 优化结果视图的布局和对齐方式 - 调整结果项的内边距和文本样式 * ci(workflow): 移除Firefox测试以简化CI流程 仅保留Chrome浏览器的构建步骤,减少CI运行时间和资源消耗
140 lines
5.3 KiB
TypeScript
140 lines
5.3 KiB
TypeScript
import '../.wxt/types/imports.d.ts';
|
|
import {
|
|
fillAllFields,
|
|
clearAllFields,
|
|
fillSelectedFields,
|
|
scanFormFields,
|
|
highlightField,
|
|
unhighlightField,
|
|
flashField,
|
|
FillMode,
|
|
type FormFieldInfo,
|
|
} from '@/utils/dummyDataGenerator';
|
|
import { MessageAction, type MessagePayload, type MessageResponse } from '@/utils/messages';
|
|
|
|
// 存储当前扫描到的字段列表,用于高亮联动
|
|
let currentFields: FormFieldInfo[] = [];
|
|
|
|
export default defineContentScript({
|
|
matches: ['<all_urls>'],
|
|
runAt: 'document_end',
|
|
main() {
|
|
// 监听来自 popup/sidepanel 的消息
|
|
chrome.runtime.onMessage.addListener(
|
|
(message: MessagePayload, _sender, sendResponse: (response: MessageResponse) => void) => {
|
|
try {
|
|
switch (message.action) {
|
|
case MessageAction.SCAN_FORM_FIELDS: {
|
|
const result = scanFormFields();
|
|
currentFields = result.fields;
|
|
sendResponse({
|
|
success: true,
|
|
fields: result.fields.map((f) => ({
|
|
id: f.id,
|
|
fieldType: f.fieldType,
|
|
label: f.label,
|
|
placeholder: f.placeholder,
|
|
name: f.name,
|
|
value: f.value,
|
|
isSelected: f.isSelected,
|
|
generatedValue: f.generatedValue,
|
|
})),
|
|
totalCount: result.totalCount,
|
|
validCount: result.validCount,
|
|
hasModal: !!result.modalContainer,
|
|
});
|
|
break;
|
|
}
|
|
case MessageAction.FILL_VALID_DATA:
|
|
fillAllFields(FillMode.VALID, message.includeHidden || false);
|
|
sendResponse({ success: true, message: '已填充有效数据' });
|
|
break;
|
|
case MessageAction.FILL_INVALID_DATA:
|
|
fillAllFields(FillMode.INVALID, message.includeHidden || false);
|
|
sendResponse({ success: true, message: '已填充无效数据' });
|
|
break;
|
|
case MessageAction.FILL_SELECTED_FIELDS: {
|
|
// 使用之前扫描时存储的字段,因为它们包含element属性
|
|
const incomingFields = message.fields || [];
|
|
const fieldsToFill = currentFields.map((field) => {
|
|
const incomingField = incomingFields.find((f) => f.id === field.id);
|
|
if (incomingField) {
|
|
return {
|
|
...field,
|
|
fieldType: incomingField.fieldType,
|
|
isSelected: incomingField.isSelected,
|
|
useInvalidData: (incomingField as { useInvalidData?: boolean }).useInvalidData,
|
|
};
|
|
}
|
|
return field;
|
|
});
|
|
const count = fillSelectedFields(fieldsToFill, message.mode || FillMode.VALID);
|
|
sendResponse({ success: true, message: `已填充 ${count} 个字段` });
|
|
break;
|
|
}
|
|
case MessageAction.CLEAR_ALL_FIELDS:
|
|
clearAllFields();
|
|
sendResponse({ success: true, message: '已清空所有字段' });
|
|
break;
|
|
case MessageAction.HIGHLIGHT_FIELD: {
|
|
const fieldId = message.fieldId;
|
|
const field = currentFields.find((f) => f.id === fieldId);
|
|
if (field) {
|
|
highlightField(field.element);
|
|
sendResponse({ success: true });
|
|
} else {
|
|
sendResponse({ success: false, message: '未找到字段' });
|
|
}
|
|
break;
|
|
}
|
|
case MessageAction.UNHIGHLIGHT_FIELD: {
|
|
const fieldId = message.fieldId;
|
|
const field = currentFields.find((f) => f.id === fieldId);
|
|
if (field) {
|
|
unhighlightField(field.element);
|
|
sendResponse({ success: true });
|
|
} else {
|
|
sendResponse({ success: false, message: '未找到字段' });
|
|
}
|
|
break;
|
|
}
|
|
case MessageAction.HIGHLIGHT_ALL_FIELDS: {
|
|
const fieldIds = message.fieldIds || [];
|
|
fieldIds.forEach((id) => {
|
|
const field = currentFields.find((f) => f.id === id);
|
|
if (field) {
|
|
highlightField(field.element);
|
|
}
|
|
});
|
|
sendResponse({ success: true });
|
|
break;
|
|
}
|
|
case MessageAction.UNHIGHLIGHT_ALL_FIELDS:
|
|
currentFields.forEach((field) => {
|
|
unhighlightField(field.element);
|
|
});
|
|
sendResponse({ success: true });
|
|
break;
|
|
case MessageAction.FLASH_FIELD: {
|
|
const fieldId = message.fieldId;
|
|
const field = currentFields.find((f) => f.id === fieldId);
|
|
if (field) {
|
|
flashField(field.element);
|
|
sendResponse({ success: true });
|
|
} else {
|
|
sendResponse({ success: false, message: '未找到字段' });
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
sendResponse({ success: false, message: '未知操作' });
|
|
}
|
|
} catch (error) {
|
|
console.error('执行操作失败:', error);
|
|
sendResponse({ success: false, message: '执行操作失败' });
|
|
}
|
|
},
|
|
);
|
|
},
|
|
});
|