@tsingroc/tsingroc-components 5.0.0-alpha.10 → 5.0.0-alpha.12

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 (140) hide show
  1. package/dist/components/Auth.d.ts +310 -0
  2. package/dist/components/Auth.js +267 -0
  3. package/dist/components/AutoResizedECharts.d.ts +21 -0
  4. package/dist/components/AutoResizedECharts.js +98 -0
  5. package/dist/components/Calendar.d.ts +50 -0
  6. package/dist/components/Calendar.js +130 -0
  7. package/dist/components/CircularProgress.d.ts +21 -0
  8. package/dist/components/CircularProgress.js +34 -0
  9. package/dist/components/ConnectedECharts.d.ts +31 -0
  10. package/dist/components/ConnectedECharts.js +100 -0
  11. package/dist/components/ECharts.d.ts +57 -0
  12. package/dist/components/ECharts.js +255 -0
  13. package/dist/components/Header.d.ts +67 -0
  14. package/dist/components/Header.js +171 -0
  15. package/dist/components/ImageBackground.d.ts +32 -0
  16. package/dist/components/ImageBackground.js +76 -0
  17. package/dist/components/IndicatorLight.d.ts +44 -0
  18. package/dist/components/IndicatorLight.js +124 -0
  19. package/dist/components/LeftAlignedECharts.d.ts +42 -0
  20. package/dist/components/LeftAlignedECharts.js +270 -0
  21. package/dist/components/LineChartEditor.d.ts +74 -0
  22. package/dist/components/LineChartEditor.js +458 -0
  23. package/dist/components/LineChartTable.d.ts +38 -0
  24. package/dist/components/LineChartTable.js +245 -0
  25. package/dist/components/LinkedLineChart.d.ts +45 -0
  26. package/dist/components/LinkedLineChart.js +159 -0
  27. package/dist/components/QuickDateRangePicker.d.ts +30 -0
  28. package/dist/components/QuickDateRangePicker.js +58 -0
  29. package/dist/components/SegmentedButtons.d.ts +22 -0
  30. package/dist/components/SegmentedButtons.js +86 -0
  31. package/dist/components/Sidebar.d.ts +79 -0
  32. package/dist/components/Sidebar.js +178 -0
  33. package/dist/components/TsingrocDatePicker.d.ts +38 -0
  34. package/dist/components/TsingrocDatePicker.js +64 -0
  35. package/dist/components/TsingrocTheme.d.ts +15 -0
  36. package/dist/components/TsingrocTheme.js +72 -0
  37. package/dist/components/UserButton.d.ts +42 -0
  38. package/dist/components/UserButton.js +105 -0
  39. package/dist/components/VerticalColorLegend.d.ts +7 -0
  40. package/dist/components/VerticalColorLegend.js +208 -0
  41. package/dist/components/WeatherMap.d.ts +18 -0
  42. package/dist/components/WeatherMap.js +658 -0
  43. package/dist/deckgl/TiandituLayer.d.ts +13 -0
  44. package/dist/deckgl/TiandituLayer.js +44 -0
  45. package/dist/deckgl/WeatherData.d.ts +53 -0
  46. package/dist/deckgl/WeatherData.js +94 -0
  47. package/dist/deckgl/index.d.ts +1 -0
  48. package/dist/deckgl/index.js +1 -0
  49. package/dist/echarts/coordinateSystems/grid.d.ts +43 -0
  50. package/dist/echarts/coordinateSystems/grid.js +107 -0
  51. package/dist/echarts/coordinateSystems/index.js +2 -0
  52. package/dist/echarts/coordinateSystems/polar.d.ts +45 -0
  53. package/dist/echarts/coordinateSystems/polar.js +96 -0
  54. package/dist/echarts/gl-types.d.js +0 -0
  55. package/dist/echarts/gl.d.ts +115 -0
  56. package/dist/echarts/gl.js +47 -0
  57. package/dist/echarts/index.d.ts +46 -0
  58. package/dist/echarts/index.js +46 -0
  59. package/dist/echarts/legend.d.ts +17 -0
  60. package/dist/echarts/legend.js +15 -0
  61. package/dist/echarts/radar.d.ts +24 -0
  62. package/dist/echarts/radar.js +22 -0
  63. package/dist/echarts/series/barSeries.d.ts +23 -0
  64. package/dist/echarts/series/barSeries.js +18 -0
  65. package/dist/echarts/series/boxplotSeries.d.ts +21 -0
  66. package/dist/echarts/series/boxplotSeries.js +40 -0
  67. package/dist/echarts/series/index.js +7 -0
  68. package/dist/echarts/series/intervalSeries.d.ts +32 -0
  69. package/dist/echarts/series/intervalSeries.js +55 -0
  70. package/dist/echarts/series/lineSeries.d.ts +36 -0
  71. package/dist/echarts/series/lineSeries.js +45 -0
  72. package/dist/echarts/series/maxBarSeries.d.ts +18 -0
  73. package/dist/echarts/series/maxBarSeries.js +39 -0
  74. package/dist/echarts/series/pieSeries.d.ts +31 -0
  75. package/dist/echarts/series/pieSeries.js +47 -0
  76. package/dist/echarts/series/windLineSeries.d.ts +47 -0
  77. package/dist/echarts/series/windLineSeries.js +51 -0
  78. package/{src/echarts/tooltip.ts → dist/echarts/tooltip.d.ts} +1 -5
  79. package/dist/echarts/tooltip.js +18 -0
  80. package/dist/env.d.js +0 -0
  81. package/dist/index.d.ts +20 -0
  82. package/dist/index.js +20 -0
  83. package/dist/utils/debug.d.ts +1 -0
  84. package/dist/utils/debug.js +25 -0
  85. package/dist/utils/index.d.ts +4 -0
  86. package/dist/utils/index.js +4 -0
  87. package/dist/utils/math.d.ts +9 -0
  88. package/{src/utils/math.ts → dist/utils/math.js} +2 -2
  89. package/dist/utils/mock.d.ts +8 -0
  90. package/dist/utils/mock.js +40 -0
  91. package/dist/utils/startOfQuarter.d.ts +2 -0
  92. package/dist/utils/startOfQuarter.js +4 -0
  93. package/package.json +26 -14
  94. package/src/components/Auth.tsx +0 -623
  95. package/src/components/AutoResizedECharts.tsx +0 -70
  96. package/src/components/Calendar.tsx +0 -182
  97. package/src/components/CircularProgress.tsx +0 -38
  98. package/src/components/ConnectedECharts.tsx +0 -62
  99. package/src/components/ECharts.tsx +0 -206
  100. package/src/components/Header.tsx +0 -136
  101. package/src/components/ImageBackground.tsx +0 -58
  102. package/src/components/IndicatorLight.tsx +0 -106
  103. package/src/components/LeftAlignedECharts.tsx +0 -190
  104. package/src/components/LineChartEditor.tsx +0 -558
  105. package/src/components/LineChartTable.tsx +0 -286
  106. package/src/components/LinkedECharts.tsx +0 -51
  107. package/src/components/LinkedLineChart.tsx +0 -144
  108. package/src/components/QuickDateRangePicker.tsx +0 -84
  109. package/src/components/SegmentedButtons.tsx +0 -46
  110. package/src/components/Sidebar.tsx +0 -271
  111. package/src/components/StrictECharts.d.ts +0 -47
  112. package/src/components/StrictECharts.js +0 -1
  113. package/src/components/TsingrocDatePicker.tsx +0 -103
  114. package/src/components/TsingrocTheme.tsx +0 -48
  115. package/src/components/UserButton.tsx +0 -165
  116. package/src/components/VerticalColorLegend.tsx +0 -73
  117. package/src/components/WeatherMap.tsx +0 -522
  118. package/src/deckgl/TiandituLayer.ts +0 -56
  119. package/src/deckgl/WeatherData.ts +0 -157
  120. package/src/deckgl/index.ts +0 -4
  121. package/src/echarts/coordinateSystems/grid.ts +0 -143
  122. package/src/echarts/coordinateSystems/polar.ts +0 -148
  123. package/src/echarts/gl.ts +0 -159
  124. package/src/echarts/index.ts +0 -129
  125. package/src/echarts/legend.ts +0 -36
  126. package/src/echarts/radar.ts +0 -46
  127. package/src/echarts/series/barSeries.ts +0 -37
  128. package/src/echarts/series/boxplotSeries.ts +0 -62
  129. package/src/echarts/series/intervalSeries.ts +0 -70
  130. package/src/echarts/series/lineSeries.ts +0 -78
  131. package/src/echarts/series/maxBarSeries.ts +0 -55
  132. package/src/echarts/series/pieSeries.ts +0 -76
  133. package/src/echarts/series/windLineSeries.ts +0 -113
  134. package/src/index.ts +0 -118
  135. package/src/types.d.ts +0 -5
  136. package/src/utils/debug.ts +0 -39
  137. package/src/utils/mock.ts +0 -69
  138. package/src/utils/startOfQuarter.ts +0 -6
  139. /package/{src/echarts/coordinateSystems/index.ts → dist/echarts/coordinateSystems/index.d.ts} +0 -0
  140. /package/{src/echarts/series/index.ts → dist/echarts/series/index.d.ts} +0 -0
@@ -1,286 +0,0 @@
1
- import { ConfigProvider, Flex, Table, theme, type FlexProps } from "antd";
2
- import { createStyles } from "antd-style";
3
- import type { ColumnType, ColumnsType, TableRef } from "antd/es/table";
4
- import type { ElementEvent, LineSeriesOption } from "echarts";
5
- import {
6
- useContext,
7
- useEffect,
8
- useMemo,
9
- useRef,
10
- useState,
11
- type TdHTMLAttributes,
12
- } from "react";
13
-
14
- import * as echarts from "../echarts";
15
- import StrictECharts from "./StrictECharts";
16
-
17
- export interface LineChartTableProps extends Omit<FlexProps, "children"> {
18
- /** X 轴的数据。*/
19
- xData: (string | number)[];
20
- /**
21
- * X 轴的名称。
22
- * @default "时间"
23
- */
24
- xName?: string;
25
- /**
26
- * Y 轴的名称。
27
- * @default "数值"
28
- */
29
- yName?: string;
30
- /** Y 轴的单位,默认不显示。*/
31
- yUnit?: string;
32
- /** 各个曲线的名称、数据和其它选项(颜色、插值模式等)。*/
33
- series?: { name: string; data: number[]; option?: LineSeriesOption }[];
34
- /**
35
- * 折线图的高度。表格会自动占满剩余的高度。
36
- * @default 175
37
- */
38
- chartHeight?: string | number;
39
- }
40
-
41
- interface DataItem {
42
- key: number;
43
- x: string | number;
44
- [key: `y${string}`]: number;
45
- hover?: true | number;
46
- }
47
-
48
- const EMPTY: [] = [];
49
-
50
- /**
51
- * 折线图与表格的组合,用鼠标指向表格中的数据时会高亮折线图中的对应数据,反之亦然。
52
- *
53
- * 除了文档列出的属性外,多余的属性会被传递给最外层的 [Flex][1] 组件。
54
- *
55
- * [1]: https://ant-design.antgroup.com/components/flex-cn#api
56
- */
57
- function LineChartTable(props: LineChartTableProps) {
58
- const {
59
- xData,
60
- xName = "时间",
61
- yName = "数值",
62
- yUnit,
63
- series = [],
64
- chartHeight = 175,
65
- ...rest
66
- } = props;
67
- // TODO i18n
68
- const unitString = yUnit !== undefined ? `(${yUnit})` : "";
69
- const { cx, styles, theme: token } = useStyles();
70
- const isDark =
71
- useContext(ConfigProvider.ConfigContext).theme?.algorithm ===
72
- theme.darkAlgorithm;
73
- const echartsRef = useRef<StrictECharts>(null);
74
- const tableRef = useRef<TableRef>(null);
75
- type HoverSource = "chart" | "table";
76
- const [[hoverSource, hoverXIndex, hoverY], setHover] = useState<
77
- [] | [HoverSource, number] | [HoverSource, number, number]
78
- >(EMPTY);
79
- let closestYIndex: number | undefined;
80
- let closestY: number | undefined;
81
- if (hoverXIndex !== undefined && hoverY !== undefined) {
82
- let minDist = Infinity;
83
- series.forEach((series, index) => {
84
- const y = series.data[hoverXIndex];
85
- const dist = Math.abs(y - hoverY);
86
- if (dist < minDist) {
87
- closestYIndex = index;
88
- closestY = y;
89
- minDist = dist;
90
- }
91
- });
92
- }
93
- const option = echarts.buildEChartsOption(
94
- {
95
- backgroundColor: "transparent",
96
- },
97
- echarts.useGrid({
98
- option: {
99
- id: "grid",
100
- left: 12,
101
- right: 42,
102
- bottom: 40,
103
- },
104
- xAxis: {
105
- name: xName,
106
- data: xData,
107
- axisPointer: {
108
- value: xData[hoverXIndex ?? 0],
109
- status: hoverXIndex !== undefined ? "show" : "hide",
110
- },
111
- },
112
- yAxis: {
113
- name: yName + unitString,
114
- axisPointer: {
115
- value: closestY,
116
- status: closestY !== undefined ? "show" : "hide",
117
- },
118
- },
119
- series: series.map((series) => echarts.lineSeries(series)),
120
- }),
121
- echarts.legend({
122
- data: series.map((series) => series.name),
123
- option: { right: 42 },
124
- }),
125
- {
126
- axisPointer: [{ show: true, triggerOn: "none" }],
127
- dataZoom: [{ orient: "horizontal", bottom: 8, filterMode: "empty" }],
128
- },
129
- );
130
- useEffect(() => {
131
- const inst = echartsRef.current?.getEchartsInstance().getZr();
132
- if (!inst) return () => {};
133
- const onMousemove = (event: ElementEvent) => {
134
- const inst = echartsRef.current?.getEchartsInstance();
135
- if (!inst) return;
136
- const coord = [event.offsetX, event.offsetY];
137
- if (inst.containPixel("grid", coord)) {
138
- const [x, y] = inst.convertFromPixel("grid", coord);
139
- setHover(["chart", x, y]);
140
- } else {
141
- setHover(EMPTY);
142
- }
143
- };
144
- const onGlobalout = () => setHover(EMPTY);
145
- inst.on("mousemove", onMousemove);
146
- inst.on("globalout", onGlobalout);
147
- return () => {
148
- inst.off("mousemove", onMousemove);
149
- inst.off("globalout", onGlobalout);
150
- };
151
- }, []);
152
- useEffect(() => {
153
- const inst = echartsRef.current?.getEchartsInstance();
154
- if (!inst) return;
155
- if (hoverXIndex !== undefined) {
156
- inst.dispatchAction({
157
- type: "highlight",
158
- seriesIndex: closestYIndex,
159
- dataIndex: hoverXIndex,
160
- });
161
- if (hoverSource === "chart") {
162
- tableScrollTo(hoverXIndex);
163
- }
164
- } else {
165
- inst.dispatchAction({
166
- type: "downplay",
167
- });
168
- }
169
- }, [hoverSource, hoverXIndex, closestYIndex]);
170
- const tableDataWithoutHover: DataItem[] = useMemo(() => {
171
- const data = xData.map((x, i) => ({ key: i, x }) as DataItem);
172
- series.forEach((series) =>
173
- series.data.forEach((y, i) => (data[i][`y${series.name}`] = y)),
174
- );
175
- return data;
176
- }, [xData, series]);
177
- const tableData: DataItem[] = useMemo(() => {
178
- if (hoverSource === "chart" && hoverXIndex !== undefined) {
179
- const data = [...tableDataWithoutHover];
180
- data[hoverXIndex] = {
181
- ...data[hoverXIndex],
182
- hover: closestYIndex ?? true,
183
- };
184
- return data;
185
- } else {
186
- return tableDataWithoutHover;
187
- }
188
- }, [tableDataWithoutHover, hoverSource, hoverXIndex, closestYIndex]);
189
- const tableColumns = useMemo((): ColumnsType<DataItem> => {
190
- const columnWidth = `${100 / series.length}%`;
191
- return [
192
- {
193
- key: "x",
194
- dataIndex: "x",
195
- title: xName,
196
- onCell: (
197
- data: DataItem,
198
- index?: number,
199
- ): TdHTMLAttributes<HTMLTableCellElement> => ({
200
- className: cx({
201
- [styles.rowHovered]: data.hover !== undefined,
202
- }),
203
- onMouseEnter: () => setHover(["table", index as number]),
204
- onMouseLeave: () => setHover(EMPTY),
205
- }),
206
- },
207
- ...series.map(
208
- (series, yIndex): ColumnType<DataItem> => ({
209
- key: `y${series.name}`,
210
- dataIndex: `y${series.name}`,
211
- title: series.name + unitString,
212
- width: columnWidth,
213
- onCell: (
214
- data: DataItem,
215
- xIndex?: number,
216
- ): TdHTMLAttributes<HTMLTableCellElement> => ({
217
- className: cx(styles.cell, {
218
- [styles.rowHovered]: data.hover !== undefined,
219
- [styles.cellHovered]: data.hover === yIndex,
220
- }),
221
- onMouseEnter: () =>
222
- setHover(["table", xIndex as number, data[`y${series.name}`]]),
223
- onMouseLeave: () => setHover(EMPTY),
224
- }),
225
- }),
226
- ),
227
- ];
228
- }, [cx, styles, xName, series, unitString]);
229
- const tableScrollTo = (index: number) => {
230
- const table = tableRef.current?.nativeElement;
231
- if (table) {
232
- const header = table.getElementsByTagName("thead")[0];
233
- const row = table.getElementsByTagName("tr")[index];
234
- table.scrollTo({
235
- top:
236
- row.offsetTop +
237
- row.offsetHeight / 2 -
238
- (table.offsetHeight - header.offsetHeight) / 2,
239
- behavior: "smooth",
240
- });
241
- }
242
- };
243
- return (
244
- <Flex vertical gap={token.marginXS} {...rest}>
245
- <StrictECharts
246
- ref={echartsRef}
247
- option={option}
248
- theme={isDark ? "dark" : undefined}
249
- style={{ height: chartHeight, flexShrink: 0 }}
250
- />
251
- {useMemo(
252
- () => (
253
- <Table<DataItem>
254
- ref={tableRef}
255
- dataSource={tableData}
256
- columns={tableColumns}
257
- size="small"
258
- pagination={false}
259
- style={{ flexBasis: "100%", overflowY: "auto" }}
260
- onHeaderRow={() => ({
261
- style: { position: "sticky", top: 0, zIndex: 1 },
262
- })}
263
- />
264
- ),
265
- [tableData, tableColumns],
266
- )}
267
- </Flex>
268
- );
269
- }
270
-
271
- export default LineChartTable;
272
-
273
- const useStyles = createStyles(({ css, token }) => {
274
- const rowHovered = css`
275
- background: ${token.colorFillQuaternary};
276
- `;
277
- const cell = css`
278
- [class] > &:hover:hover {
279
- background: ${token.colorFillSecondary};
280
- }
281
- `;
282
- const cellHovered = css`
283
- background: ${token.colorFillSecondary};
284
- `;
285
- return { rowHovered, cell, cellHovered };
286
- });
@@ -1,51 +0,0 @@
1
- import * as echarts from "echarts";
2
- import {
3
- createContext,
4
- forwardRef,
5
- useContext,
6
- useId,
7
- type ComponentType,
8
- type ReactNode,
9
- } from "react";
10
-
11
- import StrictECharts, { type StrictEChartsProps } from "./StrictECharts";
12
-
13
- const LinkContext = createContext<string>("global");
14
-
15
- /**
16
- * 联动上下文的 Provider,用于包裹需要联动的图表。
17
- */
18
- export function EChartsLinkProvider(props: { children: ReactNode }) {
19
- return (
20
- <LinkContext.Provider value={useId()}>{props.children}</LinkContext.Provider>
21
- );
22
- }
23
-
24
- /**
25
- * 高阶组件,用于为任何签名与 `StrictECharts` 相同的图表组件添加联动功能。
26
- */
27
- export function withEChartsLink(ECharts: ComponentType<StrictEChartsProps>) {
28
- return forwardRef<StrictECharts, StrictEChartsProps>(
29
- (props, ref): ReactNode => {
30
- const group = useContext(LinkContext);
31
- return (
32
- <ECharts
33
- // @ts-expect-error unfixable error
34
- ref={ref}
35
- {...props}
36
- onChartReady={(instance) => {
37
- instance.group = group;
38
- echarts.connect(group);
39
- props.onChartReady?.(instance);
40
- }}
41
- />
42
- );
43
- },
44
- );
45
- }
46
-
47
- /**
48
- * 具有联动功能的 `StrictECharts` 组件,签名与 `StrictECharts` 完全一致。
49
- */
50
- const LinkedECharts = withEChartsLink(StrictECharts);
51
- export default LinkedECharts;
@@ -1,144 +0,0 @@
1
- import { ConfigProvider, theme } from "antd";
2
- import type { LineSeriesOption } from "echarts";
3
- import { createContext, useContext, type ReactNode } from "react";
4
-
5
- import * as echarts from "../echarts";
6
- import LinkedECharts, { EChartsLinkProvider } from "./LinkedECharts";
7
- import type { StrictEChartsProps } from "./StrictECharts";
8
-
9
- interface LineChartLinkContext {
10
- xData: (string | number)[];
11
- xName: string;
12
- }
13
-
14
- const LineChartLinkContext = createContext<LineChartLinkContext>({
15
- xData: [],
16
- xName: "时间",
17
- });
18
-
19
- export interface LineChartLinkProviderProps {
20
- /** X 轴的数据。*/
21
- xData: (string | number)[];
22
- /**
23
- * X 轴的名称。
24
- * @default "时间"
25
- */
26
- xName?: string;
27
- /** 包裹的内容,其中包含需要联动的 {@linkcode LinkedLineChart} 组件。*/
28
- children: ReactNode;
29
- }
30
-
31
- /**
32
- * {@linkcode LinkedLineChart} 联动上下文的 Provider。
33
- *
34
- * 用于包裹需要联动的 {@linkcode LinkedLineChart} 组件。
35
- */
36
- export function LineChartLinkProvider(props: LineChartLinkProviderProps) {
37
- return (
38
- <EChartsLinkProvider>
39
- <LineChartLinkContext.Provider
40
- value={{
41
- xData: props.xData,
42
- xName: props.xName ?? "时间",
43
- }}
44
- >
45
- {props.children}
46
- </LineChartLinkContext.Provider>
47
- </EChartsLinkProvider>
48
- );
49
- }
50
-
51
- export interface LinkedLineChartProps
52
- extends Omit<StrictEChartsProps, "option"> {
53
- /**
54
- * Y 轴的名称。
55
- * @default "数值"
56
- */
57
- yName?: string;
58
- /** Y 轴的单位,默认不显示。*/
59
- yUnit?: string;
60
- /** 各个曲线的名称、数据和其它选项(颜色、插值模式等)。*/
61
- series?: { name: string; data: number[]; option?: LineSeriesOption }[];
62
- /**
63
- * 是否启用横轴下方的缩放条(`dataZoom`)
64
- * @default true
65
- */
66
- dataZoom?: boolean;
67
- }
68
-
69
- /**
70
- * 折线图组件,支持多条数据曲线和横轴联动。鼠标悬停在图表上时会触发联动高亮。
71
- */
72
- function LinkedLineChart(props: LinkedLineChartProps) {
73
- const {
74
- yName = "数值",
75
- yUnit,
76
- series = [],
77
- dataZoom = true,
78
- ...rest
79
- } = props;
80
- const unitString = yUnit !== undefined ? `(${yUnit})` : "";
81
- const isDark =
82
- useContext(ConfigProvider.ConfigContext).theme?.algorithm ===
83
- theme.darkAlgorithm;
84
- const { xData, xName } = useContext(LineChartLinkContext);
85
- const option = echarts.buildEChartsOption(
86
- {
87
- backgroundColor: "transparent",
88
- },
89
- echarts.useGrid({
90
- option: {
91
- id: "grid",
92
- left: 12,
93
- right: 42,
94
- bottom: dataZoom ? 40 : 0,
95
- },
96
- xAxis: {
97
- name: xName,
98
- data: xData,
99
- axisPointer: { show: true },
100
- },
101
- yAxis: {
102
- name: yName + unitString,
103
- axisPointer: { show: false },
104
- },
105
- series: series.map((series) => echarts.lineSeries(series)),
106
- }),
107
- echarts.legend({
108
- data: series.map((series) => series.name),
109
- option: { right: 42 },
110
- }),
111
- echarts.tooltip({
112
- trigger: "axis",
113
- position: (
114
- [x],
115
- params,
116
- dom,
117
- rect,
118
- { contentSize: [popupWidth], viewSize: [chartWidth] },
119
- ) => [
120
- x + 10 + popupWidth <= chartWidth ? x + 10 : x - 10 - popupWidth,
121
- 20,
122
- ],
123
- }),
124
- {
125
- dataZoom: [
126
- {
127
- show: dataZoom,
128
- orient: "horizontal",
129
- bottom: 8,
130
- filterMode: "empty",
131
- },
132
- ],
133
- },
134
- );
135
- return (
136
- <LinkedECharts
137
- option={option}
138
- theme={isDark ? "dark" : undefined}
139
- {...rest}
140
- />
141
- );
142
- }
143
-
144
- export default LinkedLineChart;
@@ -1,84 +0,0 @@
1
- import {
2
- Button,
3
- DatePicker,
4
- Space,
5
- type ButtonProps,
6
- type SpaceProps,
7
- } from "antd";
8
- import type { RangePickerProps } from "antd/es/date-picker";
9
- import dayjs, { type Dayjs } from "dayjs";
10
- import type { NoUndefinedRangeValueType } from "rc-picker/lib/PickerInput/RangePicker";
11
- import { useState } from "react";
12
-
13
- export interface QuickDateRangePickerProps
14
- extends Omit<SpaceProps, "onChange"> {
15
- /** 一个二元组 `[start, end]`,表示时间段的开始和结束。*/
16
- value?: NoUndefinedRangeValueType<Dayjs>;
17
- onChange?: (range: NoUndefinedRangeValueType<Dayjs>) => void;
18
- /**
19
- * 内部按钮的属性,参见 [Ant Design 的 `Button` API][1]。
20
- *
21
- * [1]: https://ant-design.antgroup.com/components/button-cn#api
22
- */
23
- buttonProps?: ButtonProps;
24
- /**
25
- * 内部日期范围选择器的属性,参见 [Ant Design 的 `DatePicker.RangePicker` API][1]。
26
- *
27
- * [1]: https://ant-design.antgroup.com/components/date-picker-cn#rangepicker
28
- */
29
- pickerProps?: RangePickerProps;
30
- }
31
-
32
- const QUICK_PICK_RANGES = [
33
- { value: 3, label: "最近 3 天" },
34
- { value: 5, label: "最近 5 天" },
35
- { value: 7, label: "最近 7 天" },
36
- ];
37
-
38
- /**
39
- * 带有快速选择最近 3/5/7 天功能的日期范围选择器。
40
- *
41
- * 除了文档中列出的属性外,该组件会将其它属性传递给 [Ant Design 的 `Space` 组件][1]。
42
- *
43
- * [1]: https://ant-design.antgroup.com/components/space-cn#api
44
- */
45
- function QuickDateRangePicker(props: QuickDateRangePickerProps) {
46
- const { value, onChange, buttonProps, pickerProps, ...rest } = props;
47
- const [range, setRange] =
48
- value === undefined
49
- ? // eslint-disable-next-line react-hooks/rules-of-hooks
50
- useState<NoUndefinedRangeValueType<Dayjs> | undefined>(undefined)
51
- : [value, () => {}];
52
- function quickPick(value: number) {
53
- const end = dayjs();
54
- const start = end.subtract(value - 1, "day");
55
- const newRange: NoUndefinedRangeValueType<Dayjs> = [start, end];
56
- setRange(newRange);
57
- onChange?.(newRange);
58
- }
59
- return (
60
- <Space {...rest}>
61
- {/* TODO i18n */}
62
- {QUICK_PICK_RANGES.map((item, index) => (
63
- <Button
64
- key={index}
65
- onClick={() => quickPick(item.value)}
66
- {...buttonProps}
67
- >
68
- {item.label}
69
- </Button>
70
- ))}
71
- <DatePicker.RangePicker
72
- value={range}
73
- allowClear={false}
74
- onChange={(range) => {
75
- setRange(range as NoUndefinedRangeValueType<Dayjs>);
76
- onChange?.(range as NoUndefinedRangeValueType<Dayjs>); // 由于 allowClear=false,这里 range 不可能为 null
77
- }}
78
- {...pickerProps}
79
- />
80
- </Space>
81
- );
82
- }
83
-
84
- export default QuickDateRangePicker;
@@ -1,46 +0,0 @@
1
- import { Radio, type RadioGroupProps } from "antd";
2
-
3
- /**
4
- * 分段单选按钮。
5
- *
6
- * 该组件是 [Ant Design 的 `Radio.Group optionType="button"`][1] 的别名。
7
- *
8
- * [1]: https://ant-design.antgroup.com/components/radio-cn#radiogroup
9
- */
10
- function SegmentedButtons(props: RadioGroupProps) {
11
- return <Radio.Group optionType="button" {...props} />;
12
- }
13
-
14
- // TODO i18n
15
- const TIME_UNIT_OPTIONS = [
16
- { label: "日", value: "day" },
17
- { label: "周", value: "week" },
18
- { label: "月", value: "month" },
19
- ];
20
-
21
- export interface TimeUnitSwitcherProps
22
- extends Omit<RadioGroupProps, "onChange"> {
23
- value?: "day" | "week" | "month";
24
- onChange?: (value: "day" | "week" | "month") => void;
25
- }
26
-
27
- /**
28
- * 时间单位(日/周/月)切换按钮。
29
- *
30
- * 该组件是 {@linkcode SegmentedButtons} 的特化版本。更多属性参见 [`Radio.Group`][1]。
31
- *
32
- * [1]: https://ant-design.antgroup.com/components/radio-cn#radiogroup
33
- */
34
- export function TimeUnitSwitcher(props: TimeUnitSwitcherProps) {
35
- const { onChange, ...rest } = props;
36
- return (
37
- <Radio.Group
38
- optionType="button"
39
- options={TIME_UNIT_OPTIONS}
40
- onChange={(e) => onChange?.(e.target.value as "day" | "week" | "month")}
41
- {...rest}
42
- />
43
- );
44
- }
45
-
46
- export default SegmentedButtons;