import type { NormalizedReportViewConfig, NormalizedReportViewTab, ReportViewConfig, ReportViewTab, ReportViewTabKey } from '../types';
|
|
const DEFAULT_TITLE = '查看报告';
|
const DEFAULT_TAB_TITLES: Record<ReportViewTab['key'], string> = {
|
attachments: '附件',
|
customPrint: '报告',
|
formDetail: '表单详情',
|
};
|
|
export function validateReportViewConfig(config: Pick<ReportViewConfig, 'tabs'>) {
|
if (!config.tabs?.length) {
|
throw new Error('查看报告至少需要一个 tab');
|
}
|
}
|
|
function isNormalizedTab(tab: ReportViewTab | NormalizedReportViewTab): tab is NormalizedReportViewTab {
|
return 'internalKey' in tab;
|
}
|
|
function getTabActiveKey(tab: ReportViewTab | NormalizedReportViewTab) {
|
return isNormalizedTab(tab) ? tab.internalKey : tab.key;
|
}
|
|
function isSameActiveKey(tab: ReportViewTab | NormalizedReportViewTab, activeKey: string) {
|
if (getTabActiveKey(tab) === activeKey || tab.key === activeKey) return true;
|
return tab.key === 'formDetail' && tab.id === activeKey;
|
}
|
|
export function getDefaultActiveKey(config: ReportViewConfig | NormalizedReportViewConfig) {
|
validateReportViewConfig(config);
|
|
if (config.activeKey) {
|
const activeTab = config.tabs.find(tab => isSameActiveKey(tab, config.activeKey!));
|
if (activeTab) return getTabActiveKey(activeTab);
|
}
|
|
const firstTab = config.tabs[0];
|
return getTabActiveKey(firstTab!);
|
}
|
|
export function normalizeReportViewConfig(config: ReportViewConfig): NormalizedReportViewConfig {
|
validateReportViewConfig(config);
|
const tabs = config.tabs.map((tab, index) => ({
|
...tab,
|
internalKey: `${tab.key}:${index}`,
|
title: tab.title || DEFAULT_TAB_TITLES[tab.key],
|
}));
|
|
const normalizedConfig: NormalizedReportViewConfig = {
|
...config,
|
tabs,
|
title: config.title || DEFAULT_TITLE,
|
};
|
|
normalizedConfig.activeKey = getDefaultActiveKey(normalizedConfig);
|
return normalizedConfig;
|
}
|
|
export function getReportViewHeaderMode(config: Pick<ReportViewConfig, 'actions'> | ReportViewConfig | NormalizedReportViewConfig) {
|
return Array.isArray(config.actions) ? 'actions' : 'print';
|
}
|
|
export function hasCustomPrintTab(config: Pick<ReportViewConfig, 'tabs'>) {
|
return config.tabs.some(tab => tab.key === 'customPrint');
|
}
|
|
export function shouldEnablePrintAction(config: Pick<ReportViewConfig, 'tabs'>, activeKey: ReportViewTabKey) {
|
return activeKey === 'customPrint' && hasCustomPrintTab(config);
|
}
|