/** * 导出按钮的行为决策与地址构造。 * * 抽成纯函数是为了能直接测:这里的分支决定了「现场点导出会发生什么」, * 而它最容易出问题的两个场景——模板没配、模板接口挂了——在页面里很难复现。 * * @author nokecy */ /** 导出模板服务的接口地址:可用模板列表与按模板渲染文件。默认指向 MES 后端的 export-template 服务,其他后端可在 ExportButton 上覆盖。 */ export interface ExportTemplateApi { /** 按页面标识取可用模板(GET,参数 gridKey) */ options: string; /** 按模板渲染并下载(GET,参数 TemplateId、Filter) */ render: string; } /** 默认的导出模板服务地址。 */ export declare const DEFAULT_EXPORT_TEMPLATE_API: ExportTemplateApi; /** 后端 `export-template/options` 返回的模板项 */ export interface ExportTemplateOption { id: string; name: string; isDefault: boolean; } /** 导出按钮该以什么形态出现 */ export type ExportAction = /** 没有可用模板:走页面自带的旧导出入口 */ { kind: 'legacy'; } /** 只有一个模板:按钮直接导 */ | { kind: 'single'; template: ExportTemplateOption; } /** 多个模板:下拉选择 */ | { kind: 'menu'; templates: ExportTemplateOption[]; defaultTemplate: ExportTemplateOption; }; /** * 根据可用模板决定导出按钮的行为。 * * 传 null / undefined 表示「没拿到模板列表」(接口失败或还没加载), * 与「确实一个模板都没配」一样回落到旧导出——模板服务出问题不该让现场导不出数据。 */ export declare const resolveExportAction: (templates: ExportTemplateOption[] | null | undefined) => ExportAction; /** * 导出接口地址。这里已经把参数百分号编码好了(Gridify 的值里可能有 `&` `#` `+`,不编会截断 query string)。 * * 因此下载不能走 `downloadBlob`:它内部还会 `encodeURI(url)` 再编一次, * `%` 被转义成 `%25`(`boxCode%3D*BOX001` → `boxCode%253D*BOX001`), * 后端解析不出筛选串——现场表现是「在列表上筛完点导出,导出的是全量」。 * 见本目录 index.tsx 里的 `download`。 */ export declare const buildExportUrl: (templateId: string, filter?: string | null, renderUrl?: string) => string; /** * 从响应头取导出文件名。 * * 文件名是运维在模板上配的(可带 {date} 之类的占位),只有服务端知道最终值; * 客户端自己起名会让那项配置永远不生效。头里取不到就用兜底名。 * * 后端用 `filename*=UTF-8''xxx`(RFC 5987)传中文名,老式 `filename="xxx"` 也认。 */ export declare const resolveFileName: (contentDisposition: string | undefined | null, fallback: string) => string; /** * 从导出失败的异常里取出给人看的错误信息。 * * 导出请求是 `responseType: 'blob'`,后端返回的 JSON 错误体也会被 axios 当成 blob 收下, * `e.response.data.error.message` 这条路永远取不到东西——现场看到的是 axios 自己的 * "Request failed with status code 500",既不知道是数据太多超时还是模板配错。 * 所以先把 blob 读回来解析一次。 */ export declare const resolveExportError: (error: any) => Promise;