刘光辉
7 小时以前 0dfe84494048ce27ba8449831782128412d3eb13
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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);
}