@tsingroc/tsingroc-components 5.0.2 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/dist/components/BarLineChart/BarLineChart.module.css +10 -0
  2. package/dist/components/BarLineChart/index.d.ts +66 -0
  3. package/dist/components/BarLineChart/index.js +590 -0
  4. package/dist/components/BaseBarChart/BaseBarChart.module.css +12 -0
  5. package/dist/components/BaseBarChart/index.d.ts +33 -0
  6. package/dist/components/BaseBarChart/index.js +121 -0
  7. package/dist/components/DataCellNumber/DataCellNumber.module.css +20 -0
  8. package/dist/components/DataCellNumber/index.d.ts +14 -0
  9. package/dist/components/DataCellNumber/index.js +142 -0
  10. package/dist/components/FlexColLayout/index.d.ts +6 -0
  11. package/dist/components/FlexColLayout/index.js +40 -0
  12. package/dist/components/FlexRowLayout/index.d.ts +5 -0
  13. package/dist/components/FlexRowLayout/index.js +45 -0
  14. package/dist/components/HighlightSyncedECharts/index.d.ts +47 -0
  15. package/dist/components/HighlightSyncedECharts/index.js +260 -0
  16. package/dist/components/HighlightSyncedTable/index.d.ts +8 -0
  17. package/dist/components/HighlightSyncedTable/index.js +183 -0
  18. package/dist/components/LoadingSection/index.d.ts +41 -0
  19. package/dist/components/LoadingSection/index.js +183 -0
  20. package/dist/components/LoadingSkeleton/index.d.ts +42 -0
  21. package/dist/components/LoadingSkeleton/index.js +634 -0
  22. package/dist/components/ScrollableTable/ScrollableTable.module.css +21 -0
  23. package/dist/components/ScrollableTable/index.d.ts +13 -0
  24. package/dist/components/ScrollableTable/index.js +29 -0
  25. package/dist/components/TsingrocTable/TsingrocTable.module.css +32 -0
  26. package/dist/components/TsingrocTable/index.d.ts +12 -0
  27. package/dist/components/TsingrocTable/index.js +23 -0
  28. package/dist/components/TsingrocTheme/index.js +3 -3
  29. package/dist/index.d.ts +4 -0
  30. package/dist/index.js +4 -0
  31. package/dist/pages/DayAheadReviewPage/components/PricePlot/index.d.ts +7 -0
  32. package/dist/pages/DayAheadReviewPage/components/PricePlot/index.js +136 -0
  33. package/dist/pages/DayAheadReviewPage/components/ProfitBarChart/ProfitBarChart.module.css +13 -0
  34. package/dist/pages/DayAheadReviewPage/components/ProfitBarChart/index.d.ts +17 -0
  35. package/dist/pages/DayAheadReviewPage/components/ProfitBarChart/index.js +278 -0
  36. package/dist/pages/DayAheadReviewPage/components/RevenueCard/RevenueCard.module.css +40 -0
  37. package/dist/pages/DayAheadReviewPage/components/RevenueCard/index.d.ts +9 -0
  38. package/dist/pages/DayAheadReviewPage/components/RevenueCard/index.js +195 -0
  39. package/dist/pages/DayAheadReviewPage/components/RevenueSummaryCard/RevenueSummaryCard.module.css +38 -0
  40. package/dist/pages/DayAheadReviewPage/components/RevenueSummaryCard/index.d.ts +10 -0
  41. package/dist/pages/DayAheadReviewPage/components/RevenueSummaryCard/index.js +117 -0
  42. package/dist/pages/DayAheadReviewPage/components/ReviewLineChart/ReviewLineChart.module.css +11 -0
  43. package/dist/pages/DayAheadReviewPage/components/ReviewLineChart/index.d.ts +53 -0
  44. package/dist/pages/DayAheadReviewPage/components/ReviewLineChart/index.js +398 -0
  45. package/dist/pages/DayAheadReviewPage/components/ReviewSummaryTable/ReviewSummaryTable.module.css +33 -0
  46. package/dist/pages/DayAheadReviewPage/components/ReviewSummaryTable/index.d.ts +17 -0
  47. package/dist/pages/DayAheadReviewPage/components/ReviewSummaryTable/index.js +187 -0
  48. package/dist/pages/DayAheadReviewPage/components/StrategyPlot/index.d.ts +10 -0
  49. package/dist/pages/DayAheadReviewPage/components/StrategyPlot/index.js +223 -0
  50. package/dist/pages/DayAheadReviewPage/components/SummaryTable/index.d.ts +7 -0
  51. package/dist/pages/DayAheadReviewPage/components/SummaryTable/index.js +39 -0
  52. package/dist/pages/DayAheadReviewPage/components/SummaryTable/useTableColumns.d.ts +10 -0
  53. package/dist/pages/DayAheadReviewPage/components/SummaryTable/useTableColumns.js +307 -0
  54. package/dist/pages/DayAheadReviewPage/hook/useDayAheadReviewDate.d.ts +137 -0
  55. package/dist/pages/DayAheadReviewPage/hook/useDayAheadReviewDate.js +252 -0
  56. package/dist/pages/DayAheadReviewPage/index.d.ts +149 -0
  57. package/dist/pages/DayAheadReviewPage/index.js +259 -0
  58. package/dist/pages/DayAheadReviewPage/layout/LeftChartContainer.d.ts +12 -0
  59. package/dist/pages/DayAheadReviewPage/layout/LeftChartContainer.js +236 -0
  60. package/dist/pages/DayAheadReviewPage/layout/ReviewPageLayout.d.ts +4 -0
  61. package/dist/pages/DayAheadReviewPage/layout/ReviewPageLayout.js +32 -0
  62. package/dist/pages/DayAheadReviewPage/layout/RightSummaryContainer.d.ts +14 -0
  63. package/dist/pages/DayAheadReviewPage/layout/RightSummaryContainer.js +199 -0
  64. package/dist/pages/DayAheadReviewPage/layout/TopDayReviewHeader.d.ts +9 -0
  65. package/dist/pages/DayAheadReviewPage/layout/TopDayReviewHeader.js +115 -0
  66. package/dist/pages/DayAheadReviewPage/types/dayahead.d.ts +172 -0
  67. package/dist/pages/DayAheadReviewPage/types/dayahead.js +1 -0
  68. package/dist/utils/accessibility.d.ts +114 -0
  69. package/dist/utils/accessibility.js +214 -0
  70. package/dist/utils/constants.d.ts +18 -0
  71. package/dist/utils/constants.js +34 -0
  72. package/dist/utils/export.d.ts +10 -0
  73. package/dist/utils/export.js +72 -0
  74. package/dist/utils/formatters.d.ts +46 -0
  75. package/dist/utils/formatters.js +84 -0
  76. package/dist/utils/index.d.ts +1 -0
  77. package/dist/utils/index.js +1 -0
  78. package/dist/utils/presenters.d.ts +24 -0
  79. package/dist/utils/presenters.js +48 -0
  80. package/dist/utils/ui.d.ts +116 -0
  81. package/dist/utils/ui.js +171 -0
  82. package/package.json +27 -25
@@ -0,0 +1,137 @@
1
+ import type { Dayjs } from "dayjs";
2
+ /**
3
+ * 日前复盘日期钩子的配置选项。
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * const options: UseDayAheadReviewDateOptions = {
8
+ * projectId: "power-market-review",
9
+ * serviceStartDay: "2024-01-01",
10
+ * serviceEndDay: "2024-12-31",
11
+ * };
12
+ * ```
13
+ */
14
+ export interface UseDayAheadReviewDateOptions {
15
+ /**
16
+ * 用于会话存储键作用域的唯一标识符。
17
+ * 防止多个实例之间的日期选择冲突。
18
+ *
19
+ * @example "power-market-review"
20
+ */
21
+ projectId: string;
22
+ /**
23
+ * 服务开始日期,格式为 `YYYY-MM-DD`。
24
+ * 此值之前的日期将在选择器中被禁用。
25
+ *
26
+ * @optional
27
+ * @example "2024-01-01"
28
+ */
29
+ serviceStartDay?: string;
30
+ /**
31
+ * 服务结束日期,格式为 `YYYY-MM-DD`。
32
+ * 此值之后的日期将在选择器中被禁用。
33
+ *
34
+ * @optional
35
+ * @example "2024-12-31"
36
+ */
37
+ serviceEndDay?: string;
38
+ /**
39
+ * 可选的初始日期覆盖。
40
+ * 如果未提供,默认为昨天(D-1)。
41
+ *
42
+ * @optional
43
+ */
44
+ initialDate?: Dayjs;
45
+ }
46
+ /**
47
+ * 日前复盘日期钩子的返回值。
48
+ *
49
+ * 提供日期状态管理,具有自动边界约束
50
+ * 和兼容 Ant Design DatePicker 的禁用日期函数。
51
+ */
52
+ export interface UseDayAheadReviewDateResult {
53
+ /**
54
+ * 当前选中的日期,已约束到服务期间边界内。
55
+ * 用于 DatePicker 的 `value` 属性。
56
+ */
57
+ date: Dayjs;
58
+ /**
59
+ * 更新选中日期的函数。
60
+ * 自动将新值约束到服务期间边界内
61
+ * 并持久化到会话存储。
62
+ *
63
+ * @param newDate - 要设置的新日期(将被约束到边界内)
64
+ */
65
+ setDate: (date: Dayjs) => void;
66
+ /**
67
+ * 格式化的交易日字符串,格式为 `YYYY-MM-DD`。
68
+ * 用于 API 调用和数据获取。
69
+ *
70
+ * @example "2024-01-15"
71
+ */
72
+ tradingDay: string;
73
+ /**
74
+ * 从 `serviceStartDay` 派生的最小可选日期。
75
+ * 如果没有开始日期约束则为 `undefined`。
76
+ */
77
+ minDate: Dayjs | undefined;
78
+ /**
79
+ * 从 `serviceEndDay` 派生的最大可选日期。
80
+ * 如果没有结束日期约束则为 `undefined`。
81
+ */
82
+ maxDate: Dayjs | undefined;
83
+ /**
84
+ * Ant Design DatePicker 的禁用日期函数。
85
+ * 对于服务期间之外的日期返回 `true`。
86
+ *
87
+ * @param current - 正在评估的日期
88
+ * @returns 如果日期应该被禁用则返回 `true`
89
+ */
90
+ disabledDate: (current: Dayjs | null) => boolean;
91
+ }
92
+ /**
93
+ * 用于管理日前复盘日期选择的自定义 React 钩子。
94
+ *
95
+ * 提供日期状态管理,具有会话存储持久化、
96
+ * 自动边界约束和 Ant Design DatePicker 集成。
97
+ *
98
+ * ## 功能特性
99
+ *
100
+ * - **会话存储持久化**: 选中的日期在页面刷新后依然保留
101
+ * - **自动边界约束**: 日期被限制在服务期间内
102
+ * - **智能初始化**: 默认为昨天(D-1),适用于复盘场景
103
+ * - **项目隔离**: 通过唯一的 `projectId` 可以共存多个实例
104
+ *
105
+ * ## 会话存储
106
+ *
107
+ * 日期存储的键格式:`dayAheadReview.selectedDate.{projectId}`
108
+ *
109
+ * ## 使用示例
110
+ *
111
+ * ```tsx
112
+ * function ReviewPage() {
113
+ * const { date, setDate, tradingDay, disabledDate } = useDayAheadReviewDate({
114
+ * projectId: "power-market-review",
115
+ * serviceStartDay: "2024-01-01",
116
+ * serviceEndDay: dayjs().add(7, "day").format("YYYY-MM-DD"),
117
+ * });
118
+ *
119
+ * const { data } = useQuery({
120
+ * queryKey: ["review", tradingDay],
121
+ * queryFn: () => fetchReviewData(tradingDay),
122
+ * });
123
+ *
124
+ * return (
125
+ * <DatePicker
126
+ * value={date}
127
+ * onChange={setDate}
128
+ * disabledDate={disabledDate}
129
+ * />
130
+ * );
131
+ * }
132
+ * ```
133
+ *
134
+ * @param options - 钩子的配置选项
135
+ * @returns 日期状态管理工具
136
+ */
137
+ export declare function useDayAheadReviewDate({ projectId, serviceStartDay, serviceEndDay, initialDate, }: UseDayAheadReviewDateOptions): UseDayAheadReviewDateResult;
@@ -0,0 +1,252 @@
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import dayjs from "dayjs";
3
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
4
+ const STORAGE_PREFIX = "dayAheadReview";
5
+ const getStorageKey = projectId => `${STORAGE_PREFIX}.selectedDate.${projectId}`;
6
+ const safeReadSessionStorage = key => {
7
+ try {
8
+ return sessionStorage.getItem(key);
9
+ } catch {
10
+ return null;
11
+ }
12
+ };
13
+ const safeWriteSessionStorage = (key, value) => {
14
+ try {
15
+ sessionStorage.setItem(key, value);
16
+ } catch {
17
+ console.error(`Failed to write sessionStorage for key: ${key}`);
18
+ }
19
+ };
20
+ const clampToBounds = (value, minDate, maxDate) => {
21
+ let d = value.startOf("day");
22
+ if (minDate && d.isBefore(minDate, "day")) d = minDate.startOf("day");
23
+ if (maxDate && d.isAfter(maxDate, "day")) d = maxDate.startOf("day");
24
+ return d;
25
+ };
26
+
27
+ /**
28
+ * 日前复盘日期钩子的配置选项。
29
+ *
30
+ * @example
31
+ * ```ts
32
+ * const options: UseDayAheadReviewDateOptions = {
33
+ * projectId: "power-market-review",
34
+ * serviceStartDay: "2024-01-01",
35
+ * serviceEndDay: "2024-12-31",
36
+ * };
37
+ * ```
38
+ */
39
+
40
+ /**
41
+ * 日前复盘日期钩子的返回值。
42
+ *
43
+ * 提供日期状态管理,具有自动边界约束
44
+ * 和兼容 Ant Design DatePicker 的禁用日期函数。
45
+ */
46
+
47
+ /**
48
+ * 用于管理日前复盘日期选择的自定义 React 钩子。
49
+ *
50
+ * 提供日期状态管理,具有会话存储持久化、
51
+ * 自动边界约束和 Ant Design DatePicker 集成。
52
+ *
53
+ * ## 功能特性
54
+ *
55
+ * - **会话存储持久化**: 选中的日期在页面刷新后依然保留
56
+ * - **自动边界约束**: 日期被限制在服务期间内
57
+ * - **智能初始化**: 默认为昨天(D-1),适用于复盘场景
58
+ * - **项目隔离**: 通过唯一的 `projectId` 可以共存多个实例
59
+ *
60
+ * ## 会话存储
61
+ *
62
+ * 日期存储的键格式:`dayAheadReview.selectedDate.{projectId}`
63
+ *
64
+ * ## 使用示例
65
+ *
66
+ * ```tsx
67
+ * function ReviewPage() {
68
+ * const { date, setDate, tradingDay, disabledDate } = useDayAheadReviewDate({
69
+ * projectId: "power-market-review",
70
+ * serviceStartDay: "2024-01-01",
71
+ * serviceEndDay: dayjs().add(7, "day").format("YYYY-MM-DD"),
72
+ * });
73
+ *
74
+ * const { data } = useQuery({
75
+ * queryKey: ["review", tradingDay],
76
+ * queryFn: () => fetchReviewData(tradingDay),
77
+ * });
78
+ *
79
+ * return (
80
+ * <DatePicker
81
+ * value={date}
82
+ * onChange={setDate}
83
+ * disabledDate={disabledDate}
84
+ * />
85
+ * );
86
+ * }
87
+ * ```
88
+ *
89
+ * @param options - 钩子的配置选项
90
+ * @returns 日期状态管理工具
91
+ */
92
+ export function useDayAheadReviewDate(t0) {
93
+ const $ = _c(34);
94
+ const {
95
+ projectId,
96
+ serviceStartDay,
97
+ serviceEndDay,
98
+ initialDate
99
+ } = t0;
100
+ let t1;
101
+ if ($[0] !== projectId) {
102
+ t1 = getStorageKey(projectId);
103
+ $[0] = projectId;
104
+ $[1] = t1;
105
+ } else {
106
+ t1 = $[1];
107
+ }
108
+ const storageKey = t1;
109
+ let t2;
110
+ if ($[2] !== serviceStartDay) {
111
+ t2 = serviceStartDay ? dayjs(serviceStartDay).startOf("day") : undefined;
112
+ $[2] = serviceStartDay;
113
+ $[3] = t2;
114
+ } else {
115
+ t2 = $[3];
116
+ }
117
+ const minDate = t2;
118
+ let t3;
119
+ if ($[4] !== serviceEndDay) {
120
+ t3 = serviceEndDay ? dayjs(serviceEndDay).startOf("day") : undefined;
121
+ $[4] = serviceEndDay;
122
+ $[5] = t3;
123
+ } else {
124
+ t3 = $[5];
125
+ }
126
+ const maxDate = t3;
127
+ let t4;
128
+ if ($[6] !== initialDate || $[7] !== maxDate || $[8] !== minDate || $[9] !== storageKey) {
129
+ t4 = () => {
130
+ const stored = safeReadSessionStorage(storageKey);
131
+ const now = dayjs().startOf("day");
132
+ if (stored) {
133
+ const storedDate = dayjs(stored);
134
+ if (storedDate.isValid()) {
135
+ return clampToBounds(storedDate, minDate, maxDate);
136
+ }
137
+ }
138
+ const defaultDate = clampToBounds(initialDate ?? now.subtract(1, "day"), minDate, maxDate);
139
+ safeWriteSessionStorage(storageKey, defaultDate.format("YYYY-MM-DD"));
140
+ return defaultDate;
141
+ };
142
+ $[6] = initialDate;
143
+ $[7] = maxDate;
144
+ $[8] = minDate;
145
+ $[9] = storageKey;
146
+ $[10] = t4;
147
+ } else {
148
+ t4 = $[10];
149
+ }
150
+ const [date, setDateState] = useState(t4);
151
+ const initializedProjectIdRef = useRef(null);
152
+ let t5;
153
+ let t6;
154
+ if ($[11] !== initialDate || $[12] !== maxDate || $[13] !== minDate || $[14] !== projectId || $[15] !== storageKey) {
155
+ t5 = () => {
156
+ if (initializedProjectIdRef.current === projectId) {
157
+ return;
158
+ }
159
+ const stored_0 = safeReadSessionStorage(storageKey);
160
+ const now_0 = dayjs().startOf("day");
161
+ let initialValue;
162
+ if (stored_0) {
163
+ const storedDate_0 = dayjs(stored_0);
164
+ initialValue = storedDate_0.isValid() ? clampToBounds(storedDate_0, minDate, maxDate) : clampToBounds(now_0.subtract(1, "day"), minDate, maxDate);
165
+ } else {
166
+ initialValue = clampToBounds(initialDate ?? now_0.subtract(1, "day"), minDate, maxDate);
167
+ }
168
+ safeWriteSessionStorage(storageKey, initialValue.format("YYYY-MM-DD"));
169
+ queueMicrotask(() => {
170
+ setDateState(initialValue);
171
+ });
172
+ initializedProjectIdRef.current = projectId;
173
+ };
174
+ t6 = [projectId, storageKey, minDate, maxDate, initialDate];
175
+ $[11] = initialDate;
176
+ $[12] = maxDate;
177
+ $[13] = minDate;
178
+ $[14] = projectId;
179
+ $[15] = storageKey;
180
+ $[16] = t5;
181
+ $[17] = t6;
182
+ } else {
183
+ t5 = $[16];
184
+ t6 = $[17];
185
+ }
186
+ useEffect(t5, t6);
187
+ let t7;
188
+ if ($[18] !== maxDate || $[19] !== minDate || $[20] !== storageKey) {
189
+ t7 = newDate => {
190
+ const clamped = clampToBounds(newDate, minDate, maxDate);
191
+ setDateState(clamped);
192
+ safeWriteSessionStorage(storageKey, clamped.format("YYYY-MM-DD"));
193
+ };
194
+ $[18] = maxDate;
195
+ $[19] = minDate;
196
+ $[20] = storageKey;
197
+ $[21] = t7;
198
+ } else {
199
+ t7 = $[21];
200
+ }
201
+ const setDate = t7;
202
+ let t8;
203
+ if ($[22] !== maxDate || $[23] !== minDate) {
204
+ t8 = current => {
205
+ if (!current) {
206
+ return true;
207
+ }
208
+ if (minDate && current.isBefore(minDate, "day")) {
209
+ return true;
210
+ }
211
+ if (maxDate && current.isAfter(maxDate, "day")) {
212
+ return true;
213
+ }
214
+ return false;
215
+ };
216
+ $[22] = maxDate;
217
+ $[23] = minDate;
218
+ $[24] = t8;
219
+ } else {
220
+ t8 = $[24];
221
+ }
222
+ const disabledDate = t8;
223
+ let t9;
224
+ if ($[25] !== date) {
225
+ t9 = date.format("YYYY-MM-DD");
226
+ $[25] = date;
227
+ $[26] = t9;
228
+ } else {
229
+ t9 = $[26];
230
+ }
231
+ let t10;
232
+ if ($[27] !== date || $[28] !== disabledDate || $[29] !== maxDate || $[30] !== minDate || $[31] !== setDate || $[32] !== t9) {
233
+ t10 = {
234
+ date,
235
+ setDate,
236
+ tradingDay: t9,
237
+ minDate,
238
+ maxDate,
239
+ disabledDate
240
+ };
241
+ $[27] = date;
242
+ $[28] = disabledDate;
243
+ $[29] = maxDate;
244
+ $[30] = minDate;
245
+ $[31] = setDate;
246
+ $[32] = t9;
247
+ $[33] = t10;
248
+ } else {
249
+ t10 = $[33];
250
+ }
251
+ return t10;
252
+ }
@@ -0,0 +1,149 @@
1
+ import type { Dayjs } from "dayjs";
2
+ import { useDayAheadReviewDate } from "./hook/useDayAheadReviewDate";
3
+ import type { ExtendedReviewValue, FilterOption, PricePlotValue, StrategyPlotValue } from "./types/dayahead";
4
+ export type { FilterOption };
5
+ export type { ExtendedReviewValue, PricePlotValue, ProfitPlotValue, StrategyPlotValue, } from "./types/dayahead";
6
+ export { useDayAheadReviewDate };
7
+ /**
8
+ * 复盘页面所需的所有数据,包含三部分:
9
+ *
10
+ * - `power`: 策略对比图(电量)
11
+ * - `price`: 价格走势图(价格)
12
+ * - `table`: 明细表格 + 收益图表(组合数据)
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * const data: DayAheadReviewPageData = {
17
+ * power: [{ time: "2024-01-01T00:00", forecastVolume: 120.5, ... }],
18
+ * price: [{ time: "2024-01-01T00:00", dayAheadPrice: 350.5, ... }],
19
+ * table: [{ time: "2024-01-01T00:00", forecastVolume: 120.5, dayAheadPrice: 350.5, ... }],
20
+ * };
21
+ * ```
22
+ */
23
+ export interface DayAheadReviewPageData {
24
+ /** 策略对比图的电力/电量数据 */
25
+ power: StrategyPlotValue[];
26
+ /** 价格走势图的价格数据 */
27
+ price: PricePlotValue[];
28
+ /** 明细表格和收益图表的组合数据 */
29
+ table: ExtendedReviewValue[];
30
+ }
31
+ /**
32
+ * DayAheadReviewPage 组件的属性。
33
+ *
34
+ * ## 必需属性
35
+ *
36
+ * 组件需要日期管理属性和数据。使用提供的 `useDayAheadReviewDate` 钩子可以简化日期处理。
37
+ *
38
+ * ## 可选属性
39
+ *
40
+ * - `loading`: 获取数据时显示骨架屏加载器
41
+ * - `error`: 显示错误消息提示
42
+ * - `onExport`: 导出按钮的自定义导出处理函数
43
+ *
44
+ * @example
45
+ * ```tsx
46
+ * function ReviewPage() {
47
+ * const { date, setDate, tradingDay, disabledDate } = useDayAheadReviewDate({
48
+ * projectId: "power-market",
49
+ * serviceStartDay: "2024-01-01",
50
+ * });
51
+ *
52
+ * const { data, loading } = useQuery({
53
+ * queryKey: ["review", tradingDay],
54
+ * queryFn: () => fetchReviewData(tradingDay),
55
+ * });
56
+ *
57
+ * return (
58
+ * <div style={{ height: "100vh", display: "flex", flexDirection: "column" }}>
59
+ * <DayAheadReviewPage
60
+ * date={date}
61
+ * setDate={setDate}
62
+ * disabledDate={disabledDate}
63
+ * data={data ?? { power: [], price: [], table: [] }}
64
+ * loading={loading}
65
+ * onExport={(data, date) => exportToCSV(data, `review-${date}.csv`)}
66
+ * />
67
+ * </div>
68
+ * );
69
+ * }
70
+ * ```
71
+ */
72
+ export interface DayAheadReviewPageProps {
73
+ /**
74
+ * 当前选中的显示日期。
75
+ * 通常从 `useDayAheadReviewDate` 钩子获取。
76
+ */
77
+ date: Dayjs;
78
+ /**
79
+ * 更新选中日期的回调函数。
80
+ * 通常从 `useDayAheadReviewDate` 钩子获取。
81
+ */
82
+ setDate: (date: Dayjs) => void;
83
+ /**
84
+ * 判断日期选择器中某个日期是否应该被禁用的函数。
85
+ * 通常从 `useDayAheadReviewDate` 钩子获取。
86
+ */
87
+ disabledDate: (current: Dayjs | null) => boolean;
88
+ /**
89
+ * 包含电力、价格和表格数组的交易数据。
90
+ * 完整的一天应包含 96 个数据点(15 分钟间隔)。
91
+ */
92
+ data: DayAheadReviewPageData;
93
+ /**
94
+ * 在所有图表上显示加载骨架屏覆盖层。
95
+ *
96
+ * @optional
97
+ * @default false
98
+ */
99
+ loading?: boolean;
100
+ /**
101
+ * 错误对象 - 显示包含错误详情的提示消息。
102
+ *
103
+ * @optional
104
+ */
105
+ error?: Error;
106
+ /**
107
+ * 导出按钮触发的自定义导出处理函数。组件本身不实现导出逻辑;使用者需要提供自己的实现。
108
+ *
109
+ * 可以使用 `exportDayAheadReviewDataToExcel` 工具函数快速实现 Excel 导出:
110
+ *
111
+ * ```tsx
112
+ * import { exportDayAheadReviewDataToExcel } from "@tsingroc/tsingroc-components/utils";
113
+ *
114
+ * <DayAheadReviewPage
115
+ * onExport={exportDayAheadReviewDataToExcel}
116
+ * // ... 其他属性
117
+ * />
118
+ * ```
119
+ *
120
+ * @param data - 要导出的表格数据
121
+ * @param date - 格式化的日期字符串(YYYY-MM-DD)
122
+ * @param filename - 推荐的文件名(可以不使用)
123
+ *
124
+ * @optional
125
+ * @example
126
+ * ```tsx
127
+ * onExport={(data, dateStr) => {
128
+ * const csv = convertToCSV(data);
129
+ * downloadFile(csv, `day-ahead-review-${dateStr}.csv`);
130
+ * }}
131
+ * ```
132
+ */
133
+ onExport?: (data: ExtendedReviewValue[], date: string, filename: string) => void;
134
+ }
135
+ /**
136
+ * 日前复盘页面组件。
137
+ *
138
+ * 提供了一个全面的仪表板,用于分析电力市场日前交易表现。
139
+ * 以响应式布局展示策略对比、收益分布、价格趋势和详细的间隔数据。
140
+ *
141
+ * ## 功能特性
142
+ *
143
+ * - **策略对比图表** — 对比 Agent 与人工申报/中标电量
144
+ * - **价格走势图表** — 可视化日前价格与实时价格
145
+ * - **收益分布图表** — 分析收益细分及基准对比
146
+ * - **明细表格** — 查看间隔级别数据并支持导出
147
+ * - **跨图表高亮** — 所有可视化之间的同步悬停状态
148
+ */
149
+ export default function DayAheadReviewPage({ date, setDate, disabledDate, data, loading, error, onExport, }: DayAheadReviewPageProps): import("react/jsx-runtime").JSX.Element;