/**
* 导出按钮的行为决策与地址构造。
*
* 抽成纯函数是为了能直接测:这里的分支决定了「现场点导出会发生什么」,
* 而它最容易出问题的两个场景——模板没配、模板接口挂了——在页面里很难复现。
*
* @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;