diff --git a/src/renderer/src/panels/Properties.tsx b/src/renderer/src/panels/Properties.tsx index 8eb788c..967fb96 100644 --- a/src/renderer/src/panels/Properties.tsx +++ b/src/renderer/src/panels/Properties.tsx @@ -438,6 +438,49 @@ function PropertyTab({ ); } +interface FileFilterOption { + name: string; + extensions: string[]; +} + +/** + * 按组件与字段上下文推导文件选择对话框的类型过滤器。 + * 先匹配字段本身的含义(字段键/标签),再匹配组件类别;无法识别时退回「全部文件」。 + */ +function fileFiltersFor(componentId: string, field: CatalogField): FileFilterOption[] { + const haystack = `${componentId} ${field.key} ${field.label ?? ""}`; + const filters: FileFilterOption[] = []; + if (/excel|bivartable|databook|工作簿|表格/i.test(haystack)) { + filters.push({ name: "Excel 表格", extensions: ["xlsx", "xlsm", "xls", "csv"] }); + } + if (/word|文档/i.test(haystack)) { + filters.push({ name: "Word 文档", extensions: ["docx", "doc"] }); + } + if (/pdf/i.test(haystack)) { + filters.push({ name: "PDF 文档", extensions: ["pdf"] }); + } + if (/image|ocr|CV_|vision|图片|图像|截图|模板|照片/i.test(haystack)) { + filters.push({ name: "图片文件", extensions: ["png", "jpg", "jpeg", "bmp", "gif", "webp"] }); + } + if (/zip|compress|archive|压缩/i.test(haystack)) { + filters.push({ name: "压缩文件", extensions: ["zip", "rar", "7z", "gz"] }); + } + if (/audio|speech|音频|语音|录音/i.test(haystack)) { + filters.push({ name: "音频文件", extensions: ["wav", "mp3", "flac", "ogg"] }); + } + if (/video|视频/i.test(haystack)) { + filters.push({ name: "视频文件", extensions: ["mp4", "avi", "mkv", "mov"] }); + } + if (/json/i.test(haystack)) { + filters.push({ name: "JSON 文件", extensions: ["json"] }); + } + if (!filters.length) { + return [{ name: "全部文件", extensions: ["*"] }]; + } + filters.push({ name: "全部文件", extensions: ["*"] }); + return filters; +} + function FieldControl({ field, node, @@ -486,12 +529,7 @@ function FieldControl({ const selected = await window.rpa.dialog.open({ title: field.label, directories, - filters: directories - ? undefined - : [ - { name: "Excel", extensions: ["xlsx", "xlsm", "xls"] }, - { name: "全部文件", extensions: ["*"] } - ] + filters: directories ? undefined : fileFiltersFor(node.componentId, field) }); if (selected) onChange(field.key, selected); } catch (error) {