@yoka-ui/ui 1.0.5 → 1.0.7

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 (157) hide show
  1. package/@Docs-yoka/exports.generated.md +6 -9
  2. package/README.md +39 -12
  3. package/dist/es/assets/image/skills.zip +0 -0
  4. package/dist/es/business/Empty/index.js.map +1 -1
  5. package/dist/es/business/YkCharts/Area.d.ts +18 -0
  6. package/dist/es/business/YkCharts/Area.js +336 -0
  7. package/dist/es/business/YkCharts/Area.js.map +7 -0
  8. package/dist/es/business/YkCharts/Bar.d.ts +21 -0
  9. package/dist/es/business/YkCharts/Bar.js +316 -0
  10. package/dist/es/business/YkCharts/Bar.js.map +7 -0
  11. package/dist/es/business/YkCharts/BarProperty.d.ts +21 -0
  12. package/dist/es/business/YkCharts/BarProperty.js +357 -0
  13. package/dist/es/business/YkCharts/BarProperty.js.map +7 -0
  14. package/dist/es/business/YkCharts/BarTotal.d.ts +21 -0
  15. package/dist/es/business/YkCharts/BarTotal.js +288 -0
  16. package/dist/es/business/YkCharts/BarTotal.js.map +7 -0
  17. package/dist/es/business/YkCharts/Line.d.ts +21 -0
  18. package/dist/es/business/YkCharts/Line.js +342 -0
  19. package/dist/es/business/YkCharts/Line.js.map +7 -0
  20. package/dist/es/business/YkCharts/Pie.d.ts +19 -0
  21. package/dist/es/business/YkCharts/Pie.js +107 -0
  22. package/dist/es/business/YkCharts/Pie.js.map +7 -0
  23. package/dist/es/business/YkCharts/PieProperty.d.ts +18 -0
  24. package/dist/es/business/YkCharts/PieProperty.js +180 -0
  25. package/dist/es/business/YkCharts/PieProperty.js.map +7 -0
  26. package/dist/es/business/YkCharts/Pies.d.ts +26 -0
  27. package/dist/es/business/YkCharts/Pies.js +348 -0
  28. package/dist/es/business/YkCharts/Pies.js.map +7 -0
  29. package/dist/es/business/YkCharts/constants.d.ts +1 -0
  30. package/dist/es/business/YkCharts/constants.js +47 -0
  31. package/dist/es/business/YkCharts/constants.js.map +7 -0
  32. package/dist/es/business/YkCharts/hooks.d.ts +4 -0
  33. package/dist/es/business/YkCharts/hooks.js +37 -0
  34. package/dist/es/business/YkCharts/hooks.js.map +7 -0
  35. package/dist/es/business/YkCharts/index.d.ts +9 -0
  36. package/dist/es/business/YkCharts/index.js +20 -0
  37. package/dist/es/business/YkCharts/index.js.map +7 -0
  38. package/dist/es/business/YkCharts/index.module.less +164 -0
  39. package/dist/es/business/YkCharts/tooltip.less +92 -0
  40. package/dist/es/business/YkCharts/transformData.js +16 -0
  41. package/dist/es/business/YkCharts/transformData.js.map +7 -0
  42. package/dist/es/business/YkCharts/typing.d.ts +74 -0
  43. package/dist/es/business/YkCharts/typing.js +1 -0
  44. package/dist/es/business/YkCharts/typing.js.map +7 -0
  45. package/dist/es/business/YkCharts/utils.d.ts +4 -0
  46. package/dist/es/business/YkCharts/utils.js +109 -0
  47. package/dist/es/business/YkCharts/utils.js.map +7 -0
  48. package/dist/es/business/YkCharts/variables.less +13 -0
  49. package/dist/es/business/YkLoginModule/SmsLoginForm.d.ts +25 -0
  50. package/dist/es/business/YkLoginModule/SmsLoginForm.js +178 -0
  51. package/dist/es/business/YkLoginModule/SmsLoginForm.js.map +7 -0
  52. package/dist/es/business/YkLoginModule/index.d.ts +48 -0
  53. package/dist/es/business/YkLoginModule/index.js +198 -0
  54. package/dist/es/business/YkLoginModule/index.js.map +7 -0
  55. package/dist/es/business/YkLoginModule/styles.module.less +169 -0
  56. package/dist/es/business/YkSqlEdit/code-mirror-custom.module.less +154 -0
  57. package/dist/es/business/YkSqlEdit/index.d.ts +20 -0
  58. package/dist/es/business/YkSqlEdit/index.js +180 -0
  59. package/dist/es/business/YkSqlEdit/index.js.map +7 -0
  60. package/dist/es/business/YkSqlEdit/sql-language.d.ts +11 -0
  61. package/dist/es/business/YkSqlEdit/sql-language.js +1460 -0
  62. package/dist/es/business/YkSqlEdit/sql-language.js.map +7 -0
  63. package/dist/es/components/YKMarkdown/index.d.ts +11 -0
  64. package/dist/es/components/YKMarkdown/index.js +236 -0
  65. package/dist/es/components/YKMarkdown/index.js.map +7 -0
  66. package/dist/es/components/YKMarkdown/index.module.less +83 -0
  67. package/dist/es/components/YkDateRangePicker/YkDateRangePicker.mdx +3 -3
  68. package/dist/es/creative/GlassSegmentedRadio/index.d.ts +1 -1
  69. package/dist/es/creative/SkillsWriter/index.d.ts +3 -0
  70. package/dist/es/creative/SkillsWriter/index.js +191 -0
  71. package/dist/es/creative/SkillsWriter/index.js.map +7 -0
  72. package/dist/es/creative/SkillsWriter/index.module.less +21 -0
  73. package/dist/es/index.d.ts +4 -2
  74. package/dist/es/index.js +80 -76
  75. package/dist/es/index.js.map +2 -2
  76. package/dist/es/index.less +8 -1
  77. package/dist/es/utils/ykStorybookDoc.d.ts +15 -0
  78. package/dist/es/utils/ykStorybookDoc.js +24 -2
  79. package/dist/es/utils/ykStorybookDoc.js.map +2 -2
  80. package/dist/lib/assets/image/skills.zip +0 -0
  81. package/dist/lib/business/Empty/index.js.map +1 -1
  82. package/dist/lib/business/YkCharts/Area.d.ts +18 -0
  83. package/dist/lib/business/YkCharts/Area.js +346 -0
  84. package/dist/lib/business/YkCharts/Area.js.map +7 -0
  85. package/dist/lib/business/YkCharts/Bar.d.ts +21 -0
  86. package/dist/lib/business/YkCharts/Bar.js +323 -0
  87. package/dist/lib/business/YkCharts/Bar.js.map +7 -0
  88. package/dist/lib/business/YkCharts/BarProperty.d.ts +21 -0
  89. package/dist/lib/business/YkCharts/BarProperty.js +370 -0
  90. package/dist/lib/business/YkCharts/BarProperty.js.map +7 -0
  91. package/dist/lib/business/YkCharts/BarTotal.d.ts +21 -0
  92. package/dist/lib/business/YkCharts/BarTotal.js +295 -0
  93. package/dist/lib/business/YkCharts/BarTotal.js.map +7 -0
  94. package/dist/lib/business/YkCharts/Line.d.ts +21 -0
  95. package/dist/lib/business/YkCharts/Line.js +349 -0
  96. package/dist/lib/business/YkCharts/Line.js.map +7 -0
  97. package/dist/lib/business/YkCharts/Pie.d.ts +19 -0
  98. package/dist/lib/business/YkCharts/Pie.js +117 -0
  99. package/dist/lib/business/YkCharts/Pie.js.map +7 -0
  100. package/dist/lib/business/YkCharts/PieProperty.d.ts +18 -0
  101. package/dist/lib/business/YkCharts/PieProperty.js +193 -0
  102. package/dist/lib/business/YkCharts/PieProperty.js.map +7 -0
  103. package/dist/lib/business/YkCharts/Pies.d.ts +26 -0
  104. package/dist/lib/business/YkCharts/Pies.js +337 -0
  105. package/dist/lib/business/YkCharts/Pies.js.map +7 -0
  106. package/dist/lib/business/YkCharts/constants.d.ts +1 -0
  107. package/dist/lib/business/YkCharts/constants.js +71 -0
  108. package/dist/lib/business/YkCharts/constants.js.map +7 -0
  109. package/dist/lib/business/YkCharts/hooks.d.ts +4 -0
  110. package/dist/lib/business/YkCharts/hooks.js +62 -0
  111. package/dist/lib/business/YkCharts/hooks.js.map +7 -0
  112. package/dist/lib/business/YkCharts/index.d.ts +9 -0
  113. package/dist/lib/business/YkCharts/index.js +61 -0
  114. package/dist/lib/business/YkCharts/index.js.map +7 -0
  115. package/dist/lib/business/YkCharts/index.module.less +164 -0
  116. package/dist/lib/business/YkCharts/tooltip.less +92 -0
  117. package/dist/lib/business/YkCharts/transformData.js +40 -0
  118. package/dist/lib/business/YkCharts/transformData.js.map +7 -0
  119. package/dist/lib/business/YkCharts/typing.d.ts +74 -0
  120. package/dist/lib/business/YkCharts/typing.js +18 -0
  121. package/dist/lib/business/YkCharts/typing.js.map +7 -0
  122. package/dist/lib/business/YkCharts/utils.d.ts +4 -0
  123. package/dist/lib/business/YkCharts/utils.js +143 -0
  124. package/dist/lib/business/YkCharts/utils.js.map +7 -0
  125. package/dist/lib/business/YkCharts/variables.less +13 -0
  126. package/dist/lib/business/YkLoginModule/SmsLoginForm.d.ts +25 -0
  127. package/dist/lib/business/YkLoginModule/SmsLoginForm.js +171 -0
  128. package/dist/lib/business/YkLoginModule/SmsLoginForm.js.map +7 -0
  129. package/dist/lib/business/YkLoginModule/index.d.ts +48 -0
  130. package/dist/lib/business/YkLoginModule/index.js +206 -0
  131. package/dist/lib/business/YkLoginModule/index.js.map +7 -0
  132. package/dist/lib/business/YkLoginModule/styles.module.less +169 -0
  133. package/dist/lib/business/YkSqlEdit/code-mirror-custom.module.less +154 -0
  134. package/dist/lib/business/YkSqlEdit/index.d.ts +20 -0
  135. package/dist/lib/business/YkSqlEdit/index.js +202 -0
  136. package/dist/lib/business/YkSqlEdit/index.js.map +7 -0
  137. package/dist/lib/business/YkSqlEdit/sql-language.d.ts +11 -0
  138. package/dist/lib/business/YkSqlEdit/sql-language.js +1493 -0
  139. package/dist/lib/business/YkSqlEdit/sql-language.js.map +7 -0
  140. package/dist/lib/components/YKMarkdown/index.d.ts +11 -0
  141. package/dist/lib/components/YKMarkdown/index.js +188 -0
  142. package/dist/lib/components/YKMarkdown/index.js.map +7 -0
  143. package/dist/lib/components/YKMarkdown/index.module.less +83 -0
  144. package/dist/lib/components/YkDateRangePicker/YkDateRangePicker.mdx +3 -3
  145. package/dist/lib/creative/GlassSegmentedRadio/index.d.ts +1 -1
  146. package/dist/lib/creative/SkillsWriter/index.d.ts +3 -0
  147. package/dist/lib/creative/SkillsWriter/index.js +200 -0
  148. package/dist/lib/creative/SkillsWriter/index.js.map +7 -0
  149. package/dist/lib/creative/SkillsWriter/index.module.less +21 -0
  150. package/dist/lib/index.d.ts +4 -2
  151. package/dist/lib/index.js +6 -0
  152. package/dist/lib/index.js.map +2 -2
  153. package/dist/lib/index.less +8 -1
  154. package/dist/lib/utils/ykStorybookDoc.d.ts +15 -0
  155. package/dist/lib/utils/ykStorybookDoc.js +23 -1
  156. package/dist/lib/utils/ykStorybookDoc.js.map +2 -2
  157. package/package.json +16 -2
@@ -1,13 +1,13 @@
1
1
  # @yoka-ui/ui 具名导出表
2
2
 
3
3
  > **自动生成**:`pnpm run generate:yoka-llms`(源文件 `src/index.tsx`)
4
- > **包版本**:`1.0.5`
5
- > **生成时间**:`2026-04-16T02:28:33.216Z`
4
+ > **包版本**:`1.0.7`
5
+ > **生成时间**:`2026-04-23T09:55:19.921Z`
6
6
  > 请勿手动编辑本文件;修改导出请改 `src/index.tsx` 后重新运行上述命令。
7
7
 
8
8
  ## 使用约定(给 LLM / 业务开发者)
9
9
 
10
- - **包名**:`@yoka-ui/ui`(npm 公网);可选 Git 安装:`@yoka-ui/ui`: `git+http://gitlab.sh.com/web/yoka-ui.git#v1.0.5` 等,以实际 tag 为准
10
+ - **包名**:`@yoka-ui/ui`(npm 公网);可选 Git 安装:`@yoka-ui/ui`: `git+http://gitlab.sh.com/web/yoka-ui.git#v1.0.7` 等,以实际 tag 为准
11
11
  - **导入**:仅使用下表中的**具名**导出(组件/值与 `export type` 类型),与发布产物 `dist/es/index.d.ts` 一致;勿臆造未列出符号。
12
12
  - **全局样式(常用)**:业务入口引入一行,例如 `import '@yoka-ui/ui/dist/index.less'`(若以 README / 实际产物路径为准)。
13
13
  - **技术栈**:React 18、Ant Design 5;复杂表单/表格优先使用库内封装(`InputTheme`、`TableTheme`、`ModCommonFilter` 等),需要原生 antd API 时查阅 [Ant Design 文档](https://ant.design) 或本仓库 `@Docs/llms.txt`(克隆源码时可用)。
@@ -23,7 +23,9 @@
23
23
  | `Editor` | 组件 | `./business/Editor` |
24
24
  | `Empty` | 组件 | `./business/Empty` |
25
25
  | `ModCommonFilter` | 组件 | `./business/ModCommonFilter` |
26
+ | `YkLoginModule` | 组件 | `./business/YkLoginModule` |
26
27
  | `YkPorjectSelect` | 组件 | `./business/YkPorjectSelect` |
28
+ | `YkSqlEdit` | 组件 | `./business/YkSqlEdit` |
27
29
 
28
30
  ### Export common components
29
31
 
@@ -38,9 +40,6 @@
38
40
  | `TextWithInput` | 组件 | `./components/TextWithInput` |
39
41
  | `TextWithToolTip` | 组件 | `./components/TextWithToolTip` |
40
42
  | `TreeTransfer` | 组件 | `./components/TreeTransfer` |
41
- | `DateRangeValue` | 类型 | `./components/YkDateRangePicker` |
42
- | `YkDateRangePickerProps` | 类型 | `./components/YkDateRangePicker` |
43
- | `YkDateRangePickerRef` | 类型 | `./components/YkDateRangePicker` |
44
43
  | `YkDateRangePicker` | 组件 | `./components/YkDateRangePicker` |
45
44
  | `YkRangeDateWithVS` | 组件 | `./components/YkRangeDateWithVS` |
46
45
  | `YkRangeTimeWithRecent` | 组件 | `./components/YkRangeTimeWithRecent` |
@@ -53,8 +52,6 @@
53
52
  | `ArcCheckbox` | 组件 | `./creative/ArcCheckbox` |
54
53
  | `ButtonRadioWithInfo` | 组件 | `./creative/ButtonRadioWithInfo` |
55
54
  | `ButtonWithProgress` | 组件 | `./creative/ButtonWithProgress` |
56
- | `GlassSegmentedRadioProps` | 类型 | `./creative/GlassSegmentedRadio` |
57
- | `GlassSegmentOption` | 类型 | `./creative/GlassSegmentedRadio` |
58
55
  | `GlassSegmentedRadio` | 组件 | `./creative/GlassSegmentedRadio` |
59
56
 
60
57
  ### Export layout
@@ -96,6 +93,6 @@
96
93
  ## 纯符号列表(便于检索)
97
94
 
98
95
  ```
99
- AiChat, DrawerPageInfo, Editor, Empty, ModCommonFilter, YkPorjectSelect, Clock, DebounceInput, MultipleSelect, NumericInput, RefreshButton, SearchWithHistory, TextWithInput, TextWithToolTip, TreeTransfer, DateRangeValue, YkDateRangePickerProps, YkDateRangePickerRef, YkDateRangePicker, YkRangeDateWithVS, YkRangeTimeWithRecent, ArcCheckboxProps, ArcCheckbox, ButtonRadioWithInfo, ButtonWithProgress, GlassSegmentedRadioProps, GlassSegmentOption, GlassSegmentedRadio, FlexGrid, YkContainer, YkDrawer, InputTheme, TableTheme, LabelSelect, LogicOperator, YkButton, YkCard, YkCheckbox, YkDescriptions, YkPagination, YkRadio, YkRadioBtnSpecial, YkSegmented, YkSelect, YkSpin, YkStatistic, YkSwitch, YkTabs, YkTooltip
96
+ AiChat, DrawerPageInfo, Editor, Empty, ModCommonFilter, YkLoginModule, YkPorjectSelect, YkSqlEdit, Clock, DebounceInput, MultipleSelect, NumericInput, RefreshButton, SearchWithHistory, TextWithInput, TextWithToolTip, TreeTransfer, YkDateRangePicker, YkRangeDateWithVS, YkRangeTimeWithRecent, ArcCheckboxProps, ArcCheckbox, ButtonRadioWithInfo, ButtonWithProgress, GlassSegmentedRadio, FlexGrid, YkContainer, YkDrawer, InputTheme, TableTheme, LabelSelect, LogicOperator, YkButton, YkCard, YkCheckbox, YkDescriptions, YkPagination, YkRadio, YkRadioBtnSpecial, YkSegmented, YkSelect, YkSpin, YkStatistic, YkSwitch, YkTabs, YkTooltip
100
97
  ```
101
98
 
package/README.md CHANGED
@@ -1,11 +1,35 @@
1
- ## 安装使用
1
+ ## 安装与使用
2
2
 
3
3
  ### 安装组件库
4
4
 
5
5
  ```bash
6
+ # npm
7
+ npm i @yoka-ui/ui
8
+
9
+ # 或 pnpm
6
10
  pnpm add @yoka-ui/ui
7
11
  ```
8
12
 
13
+ ### (推荐)配置 Cursor / IDE 规则
14
+
15
+ 在项目的 Cursor rules 中创建文件 `yoka-ui.mdc`,用于约束导入方式与文档入口(导出清单、LLM 索引等):
16
+
17
+ ```md
18
+ ---
19
+ description: 使用 @yoka-ui/ui 时的导入与文档约定
20
+ globs: "**/*.{ts,tsx}"
21
+ alwaysApply: false
22
+ ---
23
+
24
+ # @yoka-ui/ui
25
+
26
+ - **导入**:仅从 `@yoka-ui/ui` 做**具名** `import`,勿使用未在导出表中出现的符号。
27
+ - **导出清单(权威)**:以安装包内 `node_modules/@yoka-ui/ui/@Docs-yoka/exports.generated.md` 为准,与发布产物类型一致;该文件由 yoka-ui 在导出变更后重新生成。
28
+ - **LLM / 助手入口**:同目录 `node_modules/@yoka-ui/ui/@Docs-yoka/llms.txt`(索引、外链与使用规则摘要)。
29
+ - **API**:不确定 props 时查组件库 Storybook / 源码示例或 README,勿臆造 API;原生 antd 行为对照 [Ant Design 文档](https://ant.design)。
30
+ - **全局样式**:业务入口按需引入,常见为 `import '@yoka-ui/ui/dist/index.less'`(以 `@yoka-ui/ui` 的 README 与当前产物路径为准)。
31
+ ```
32
+
9
33
  ### 基础用法
10
34
 
11
35
  ```tsx
@@ -21,13 +45,14 @@ function App() {
21
45
  }
22
46
  ```
23
47
 
24
- ### 按需引入
48
+ ### 导入约定(重要)
25
49
 
26
50
  ```tsx
27
- // 完整引入
28
- import { YkButton } from "@yoka-ui/ui";
51
+ // 仅从包入口做“具名导入”
52
+ import { YkPorjectSelect } from "@yoka-ui/ui";
29
53
 
30
- // tree-shaking 会自动排除未使用的组件
54
+ // 具体有哪些符号可用,以 @Docs-yoka/exports.generated.md 为准
55
+ // node_modules/@yoka-ui/ui/@Docs-yoka/exports.generated.md
31
56
  ```
32
57
 
33
58
  ## 组件列表
@@ -96,13 +121,15 @@ import { YkButton } from "@yoka-ui/ui";
96
121
 
97
122
  ### 业务组件 (`src/business/`)
98
123
 
99
- | 组件 | 说明 |
100
- | --------------- | --------------------------------------------------- |
101
- | DrawerPageInfo | 抽屉页面信息 |
102
- | Editor | 富文本编辑器 |
103
- | Empty | 空状态 |
104
- | ModCommonFilter | 通用筛选器 |
105
- | YkPorjectSelect | 项目选择器(搜索、关注、在营/关服 Tab、最近访问等) |
124
+ | 组件 | 说明 |
125
+ | --------------- | -------------------------------------------------------------------- |
126
+ | DrawerPageInfo | 抽屉页面信息 |
127
+ | Editor | 富文本编辑器 |
128
+ | Empty | 空状态 |
129
+ | ModCommonFilter | 通用筛选器 |
130
+ | YkLoginModule | 登录组件(当前支持:扫码 / 短信验证码;Tabs 由 `tabs` 配置) |
131
+ | YkPorjectSelect | 项目选择器(搜索、关注、在营/关服 Tab、最近访问等) |
132
+ | YkSqlEdit | SQL 编辑器(CodeMirror 6:动态参数 `{{...}}` 高亮、关键词/函数补全) |
106
133
 
107
134
  **导出说明**:业务项目里 `import { ... } from '@yoka-ui/ui'` 可用的符号以 `[src/index.tsx](src/index.tsx)` 为准。若某组件已在源码目录中实现但尚未在入口文件中 `export`,需先在组件库补齐导出并发布后,再在业务侧引用。
108
135
 
Binary file
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/business/Empty/index.tsx"],
4
- "sourcesContent": ["import { Empty, Flex } from 'antd';\nimport type { ForwardedRef } from 'react';\nimport React from 'react';\nimport EmptyImg from './empty.png';\n\n/**\n * 空状态占位组件的 Props(ref 由 forwardRef 注入,无需在 props 中声明)\n */\ntype EmptyProps = {\n /** 空状态插图,不传则使用默认 empty.png */\n image?: React.ReactNode | string;\n /** 描述文案或自定义节点,默认「暂无数据」 */\n description?: string | React.ReactNode;\n /** 图片容器样式,会与默认宽高合并 */\n imageStyle?: React.CSSProperties;\n /** 根节点 Flex 的样式 */\n style?: React.CSSProperties;\n};\n\n/** 描述文字统一样式 */\nconst descriptionStyle: React.CSSProperties = {\n color: '#999',\n fontSize: 14,\n height: 20,\n lineHeight: '20px',\n};\n\n/**\n * 空状态占位:居中展示默认图 + 描述,支持自定义图片与文案,支持 ref 透传。\n */\nconst ForwardedEmptyPlaceholder = React.forwardRef(\n ({ image, description, imageStyle = {}, style = {} }: EmptyProps, ref: ForwardedRef<HTMLDivElement>) => {\n return (\n <Flex ref={ref} style={{ padding: '80px 0', ...style }} align=\"center\" justify=\"center\">\n <Empty\n image={image || EmptyImg}\n styles={{\n image: {\n height: 60,\n width: 150,\n display: 'inline-block',\n ...imageStyle,\n },\n }}\n description={\n description == null || description === '' ? (\n <span style={descriptionStyle}>暂无数据</span>\n ) : typeof description === 'string' ? (\n <span style={descriptionStyle}>{description}</span>\n ) : (\n description\n )\n }\n />\n </Flex>\n );\n },\n);\n\nForwardedEmptyPlaceholder.displayName = 'Empty';\n\nexport default ForwardedEmptyPlaceholder;\n"],
4
+ "sourcesContent": ["import { Empty, Flex } from 'antd';\nimport type { ForwardedRef } from 'react';\nimport React from 'react';\nimport EmptyImg from './empty.png';\n\n/**\n * 空状态占位组件的 Props(ref 由 forwardRef 注入,无需在 props 中声明)\n */\ntype EmptyProps = {\n /** 空状态插图,不传则使用默认 empty.png */\n image?: React.ReactNode | string;\n /** 描述文案或自定义节点,默认「暂无数据」 */\n description?: string | React.ReactNode;\n /** 图片容器样式,会与默认宽高合并 */\n imageStyle?: React.CSSProperties;\n /** 根节点 Flex 的样式 */\n style?: React.CSSProperties;\n};\n\n/** 描述文字统一样式 */\nconst descriptionStyle: React.CSSProperties = {\n color: '#999',\n fontSize: 14,\n height: 20,\n lineHeight: '20px',\n};\n\n/**\n * 空状态占位:居中展示默认图 + 描述,支持自定义图片与文案,支持 ref 透传。\n */\nconst ForwardedEmptyPlaceholder = React.forwardRef(\n ({ image, description, imageStyle = {}, style = {} }: EmptyProps, ref: ForwardedRef<HTMLDivElement>) => {\n return (\n <Flex ref={ref} style={{ padding: '80px 0', ...style }} align='center' justify='center'>\n <Empty\n image={image || EmptyImg}\n styles={{\n image: {\n height: 60,\n width: 150,\n display: 'inline-block',\n ...imageStyle,\n },\n }}\n description={\n description == null || description === '' ? (\n <span style={descriptionStyle}>暂无数据</span>\n ) : typeof description === 'string' ? (\n <span style={descriptionStyle}>{description}</span>\n ) : (\n description\n )\n }\n />\n </Flex>\n );\n },\n);\n\nForwardedEmptyPlaceholder.displayName = 'Empty';\n\nexport default ForwardedEmptyPlaceholder;\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;AAAA,SAAS,OAAO,YAAY;AAE5B,OAAO,WAAW;AAClB,OAAO,cAAc;AAiBrB,IAAM,mBAAwC;AAAA,EAC5C,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,YAAY;AACd;AAKA,IAAM,4BAA4B,MAAM;AAAA,EACtC,CAAC,EAAE,OAAO,aAAa,aAAa,CAAC,GAAG,QAAQ,CAAC,EAAE,GAAe,QAAsC;AACtG,WACE,oCAAC,QAAK,KAAU,OAAO,iBAAE,SAAS,YAAa,QAAS,OAAM,UAAS,SAAQ,YAC7E;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,SAAS;AAAA,QAChB,QAAQ;AAAA,UACN,OAAO;AAAA,YACL,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,SAAS;AAAA,aACN;AAAA,QAEP;AAAA,QACA,aACE,eAAe,QAAQ,gBAAgB,KACrC,oCAAC,UAAK,OAAO,oBAAkB,MAAI,IACjC,OAAO,gBAAgB,WACzB,oCAAC,UAAK,OAAO,oBAAmB,WAAY,IAE5C;AAAA;AAAA,IAGN,CACF;AAAA,EAEJ;AACF;AAEA,0BAA0B,cAAc;AAExC,IAAO,gBAAQ;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,18 @@
1
+ import { type FC } from 'react';
2
+ import type { ColumnConfig, GroupByItem, TableData } from './typing';
3
+ type RowItem = {
4
+ [key: string]: number | string;
5
+ };
6
+ type PageTypes = {
7
+ count?: number;
8
+ metric: string[];
9
+ groupBys: GroupByItem[];
10
+ tableData: TableData;
11
+ baseData: RowItem[];
12
+ columnConfigMap: {
13
+ [key: string]: ColumnConfig;
14
+ };
15
+ height?: number;
16
+ };
17
+ declare const Line: FC<PageTypes>;
18
+ export default Line;
@@ -0,0 +1,336 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+
21
+ // src/business/YkCharts/Area.tsx
22
+ import { Empty } from "antd";
23
+ import Decimal from "decimal.js";
24
+ import * as echarts from "echarts";
25
+ import React, { useEffect, useMemo, useRef } from "react";
26
+ import ReactDOMServer from "react-dom/server";
27
+ import { chartColors } from "./constants";
28
+ import { cartesianProduct, getIntervalLower } from "./hooks";
29
+ import styles from "./index.module.less";
30
+ import { formatNumber, formatValue } from "./utils";
31
+ var Line = ({
32
+ count,
33
+ // 指标显示数量
34
+ metric,
35
+ // 指标
36
+ groupBys,
37
+ // 维度
38
+ tableData,
39
+ // 表格数据
40
+ baseData,
41
+ // 基础数据
42
+ columnConfigMap,
43
+ // 列配置
44
+ height
45
+ }) => {
46
+ const { x = [], table_head = [], table_body = [], x_field, group_by } = tableData;
47
+ const chartContainerRef = useRef(null);
48
+ const chartInstanceRef = useRef(null);
49
+ const index = table_head.indexOf(x_field);
50
+ const isTotalData = x.length === 0 && index === -1;
51
+ const effectiveX = isTotalData ? ["合计"] : x;
52
+ const fullData = useMemo(() => {
53
+ if (!metric || metric.length === 0) {
54
+ return [];
55
+ }
56
+ if (group_by && group_by.length > 0) {
57
+ const validGroupBys = groupBys.filter((g) => Array.isArray(g.selected) && g.selected.length > 0);
58
+ const validGroupByKeys = validGroupBys.map((g) => g.key);
59
+ const metrics = cartesianProduct(metric, groupBys);
60
+ const chartData = [];
61
+ metrics.forEach((f) => {
62
+ const groupBysText = groupBys.filter((g) => Array.isArray(g.selected) && g.selected.length > 0).map((g) => f[g.key]).filter((value) => value !== null && value !== "").join(",");
63
+ const mItem = effectiveX.map((m) => {
64
+ const obj = {};
65
+ obj[x_field] = m;
66
+ groupBys.forEach((g) => {
67
+ obj[g.key] = f[g.key];
68
+ });
69
+ const matchKeys = isTotalData ? validGroupByKeys : [x_field, ...validGroupByKeys];
70
+ const value = matchKeys.length > 0 ? baseData.filter((d) => matchKeys.every((key) => obj[key] === d[key])).reduce((sum, d) => sum + (Number(d[f.category]) || 0), 0) : baseData.reduce((sum, d) => sum + (Number(d[f.category]) || 0), 0);
71
+ obj.value = value;
72
+ obj.name = `${f.category}${groupBysText ? "," + groupBysText : ""}`;
73
+ obj.metricName = f.category;
74
+ obj.format = columnConfigMap[f.category];
75
+ obj.x = m;
76
+ return obj;
77
+ });
78
+ chartData.push(...mItem);
79
+ });
80
+ return chartData;
81
+ } else {
82
+ const chartData = [];
83
+ metric.forEach((m) => {
84
+ effectiveX.forEach((item) => {
85
+ if (isTotalData) {
86
+ const value = baseData.reduce((sum, d) => sum + (Number(d[m]) || 0), 0);
87
+ chartData.push({
88
+ x: item,
89
+ name: m,
90
+ metricName: m,
91
+ format: columnConfigMap[m],
92
+ value
93
+ });
94
+ } else {
95
+ const row = table_body.find((d) => d[index] === item);
96
+ const obj = {
97
+ x: item,
98
+ name: m,
99
+ metricName: m,
100
+ format: columnConfigMap[m]
101
+ };
102
+ table_head.forEach((key, i) => {
103
+ obj[key] = row ? row[i] : 0;
104
+ });
105
+ obj.value = obj[m];
106
+ chartData.push(obj);
107
+ }
108
+ });
109
+ });
110
+ return chartData;
111
+ }
112
+ }, [
113
+ baseData,
114
+ metric,
115
+ groupBys,
116
+ effectiveX,
117
+ isTotalData,
118
+ index,
119
+ x_field,
120
+ table_head,
121
+ table_body,
122
+ columnConfigMap,
123
+ group_by,
124
+ x
125
+ ]);
126
+ const yAxisFormatter = useMemo(() => {
127
+ var _a;
128
+ if (metric.length === 1) {
129
+ return (_a = columnConfigMap[metric[0]]) == null ? void 0 : _a.format;
130
+ }
131
+ return null;
132
+ }, [metric, columnConfigMap]);
133
+ const series = useMemo(() => {
134
+ const first = effectiveX[0];
135
+ const firstData = fullData.filter((f) => f[x_field] === first);
136
+ firstData.sort((a, b) => b.value - a.value);
137
+ const sortedMetric = Array.from(new Set(firstData.map((item) => item.name)));
138
+ const countMetric = (firstData.length > 0 ? count ? sortedMetric.slice(0, count) : sortedMetric : metric).slice().sort((a, b) => {
139
+ const lowerA = getIntervalLower(String(a));
140
+ const lowerB = getIntervalLower(String(b));
141
+ if (!Number.isNaN(lowerA) && !Number.isNaN(lowerB))
142
+ return lowerA - lowerB;
143
+ return String(a).localeCompare(String(b));
144
+ });
145
+ return countMetric.map((interval) => ({
146
+ name: interval,
147
+ type: "line",
148
+ smooth: true,
149
+ stack: "Total",
150
+ areaStyle: {},
151
+ showSymbol: true,
152
+ symbol: "emptyCircle",
153
+ symbolSize: 0.8,
154
+ lineStyle: {
155
+ width: 1.5
156
+ },
157
+ emphasis: {
158
+ scale: 8
159
+ },
160
+ data: effectiveX.map((item) => {
161
+ const itemData = fullData.find((d) => d.name === interval && d.x === item);
162
+ return itemData ? itemData.value : 0;
163
+ })
164
+ }));
165
+ }, [fullData, metric, count, effectiveX, x_field]);
166
+ const grid = {
167
+ top: 10,
168
+ left: 0,
169
+ right: 10,
170
+ bottom: 40,
171
+ containLabel: true
172
+ };
173
+ const legend = {
174
+ bottom: 0,
175
+ type: "scroll",
176
+ itemWidth: 13,
177
+ itemStyle: {
178
+ opacity: 0
179
+ },
180
+ lineStyle: {
181
+ width: 2,
182
+ type: "solid"
183
+ }
184
+ };
185
+ const xAxis = {
186
+ type: "category",
187
+ data: effectiveX,
188
+ axisLine: {
189
+ lineStyle: {
190
+ color: "#EBEEF4"
191
+ }
192
+ },
193
+ axisLabel: {
194
+ color: "#9CA4B3",
195
+ fontSize: 12
196
+ },
197
+ axisTick: {
198
+ alignWithLabel: true
199
+ },
200
+ boundaryGap: true
201
+ };
202
+ const yAxis = {
203
+ type: "value",
204
+ splitNumber: 4,
205
+ // 设置Y轴坐标点数量
206
+ axisLine: {
207
+ show: true,
208
+ lineStyle: {
209
+ color: "#EBEEF4",
210
+ shadowOffsetY: -10,
211
+ shadowColor: "#EBEEF4"
212
+ }
213
+ },
214
+ axisLabel: {
215
+ color: "#999999",
216
+ fontSize: 12,
217
+ formatter: (value) => {
218
+ if (yAxisFormatter === "percent") {
219
+ return new Decimal(value).mul(100) + "%";
220
+ }
221
+ if (yAxisFormatter === "decimal") {
222
+ return formatValue(value, yAxisFormatter);
223
+ }
224
+ const [result, unit] = formatNumber(value, true);
225
+ return result + unit;
226
+ }
227
+ },
228
+ splitLine: {
229
+ lineStyle: {
230
+ type: [2, 3],
231
+ // 虚线
232
+ color: "#E7E7E7"
233
+ // 背景线颜色
234
+ }
235
+ },
236
+ axisTick: {
237
+ show: true
238
+ }
239
+ };
240
+ const tooltipFormatter = (params) => {
241
+ var _a, _b;
242
+ const title = (_b = (_a = params[0]) == null ? void 0 : _a.axisValue) != null ? _b : "";
243
+ const tooltipDom = /* @__PURE__ */ React.createElement("div", { className: styles.tooltip }, /* @__PURE__ */ React.createElement("div", { className: styles.title }, title), /* @__PURE__ */ React.createElement("div", { className: styles.content }, params.map((m) => {
244
+ var _a2;
245
+ const metricName = m.seriesName.split(",")[0];
246
+ const columnConfig = columnConfigMap[metricName];
247
+ const format = (_a2 = columnConfig == null ? void 0 : columnConfig.format) != null ? _a2 : "string";
248
+ const showValue = format === "currency" ? formatNumber(m.value, true) : formatValue(m.value, format);
249
+ const showValueText = showValue === "" || showValue[0] === "" ? "-" : showValue;
250
+ return /* @__PURE__ */ React.createElement("div", { className: styles.item, key: m.seriesName }, /* @__PURE__ */ React.createElement("div", { className: styles.point, style: { background: m.color } }), /* @__PURE__ */ React.createElement("div", { className: styles.category }, m.seriesName), /* @__PURE__ */ React.createElement("div", { className: styles.value }, showValueText));
251
+ })));
252
+ return ReactDOMServer.renderToStaticMarkup(tooltipDom);
253
+ };
254
+ const tooltip = {
255
+ trigger: "axis",
256
+ padding: 0,
257
+ confine: true,
258
+ enterable: true,
259
+ axisPointer: {
260
+ type: "line",
261
+ // 设置悬浮指针为线
262
+ lineStyle: {
263
+ color: "#EBEEF4",
264
+ // 设置线的颜色
265
+ type: "dashed"
266
+ // 设置虚线样式
267
+ }
268
+ },
269
+ formatter: tooltipFormatter
270
+ };
271
+ const chartOptions = useMemo(() => {
272
+ return {
273
+ color: chartColors,
274
+ grid,
275
+ legend: __spreadProps(__spreadValues({}, legend), {
276
+ itemWidth: 13,
277
+ itemStyle: {
278
+ opacity: 0
279
+ },
280
+ lineStyle: {
281
+ width: 2,
282
+ type: "solid"
283
+ }
284
+ }),
285
+ xAxis,
286
+ yAxis,
287
+ series,
288
+ tooltip
289
+ };
290
+ }, [series]);
291
+ useEffect(() => {
292
+ if (!chartContainerRef.current)
293
+ return;
294
+ let chart = chartInstanceRef.current;
295
+ if (!chart) {
296
+ chart = echarts.init(chartContainerRef.current);
297
+ chartInstanceRef.current = chart;
298
+ }
299
+ chart == null ? void 0 : chart.setOption(chartOptions, true);
300
+ return () => {
301
+ if (chartInstanceRef.current) {
302
+ chartInstanceRef.current.dispose();
303
+ chartInstanceRef.current = null;
304
+ }
305
+ };
306
+ }, [chartOptions]);
307
+ useEffect(() => {
308
+ const chartElement = chartContainerRef.current;
309
+ if (!chartElement)
310
+ return;
311
+ const resizeObserver = new ResizeObserver(() => {
312
+ const chart = chartInstanceRef.current;
313
+ if (chart) {
314
+ chart.resize();
315
+ }
316
+ });
317
+ resizeObserver.observe(chartElement);
318
+ return () => {
319
+ resizeObserver.unobserve(chartElement);
320
+ resizeObserver.disconnect();
321
+ };
322
+ }, [fullData]);
323
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, fullData.length > 0 ? /* @__PURE__ */ React.createElement(
324
+ "div",
325
+ {
326
+ ref: chartContainerRef,
327
+ className: styles.echarts,
328
+ style: { width: "100%", height: height || "100%", minHeight: 220 }
329
+ }
330
+ ) : /* @__PURE__ */ React.createElement(Empty, { className: styles.empty, description: "暂无数据", image: Empty.PRESENTED_IMAGE_SIMPLE }));
331
+ };
332
+ var Area_default = Line;
333
+ export {
334
+ Area_default as default
335
+ };
336
+ //# sourceMappingURL=Area.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/business/YkCharts/Area.tsx"],
4
+ "sourcesContent": ["import { Empty } from 'antd';\nimport Decimal from 'decimal.js';\nimport * as echarts from 'echarts';\nimport React, { type FC, useEffect, useMemo, useRef } from 'react';\nimport ReactDOMServer from 'react-dom/server';\nimport { chartColors } from './constants';\nimport { cartesianProduct, getIntervalLower } from './hooks';\nimport styles from './index.module.less';\nimport type { ColumnConfig, GroupByItem, TableData } from './typing';\nimport { formatNumber, formatValue } from './utils';\n\ntype RowItem = {\n [key: string]: number | string;\n};\n\ntype PageTypes = {\n count?: number;\n metric: string[];\n groupBys: GroupByItem[];\n tableData: TableData;\n baseData: RowItem[];\n columnConfigMap: { [key: string]: ColumnConfig };\n height?: number;\n};\n\nconst Line: FC<PageTypes> = ({\n count, // 指标显示数量\n metric, // 指标\n groupBys, // 维度\n tableData, // 表格数据\n baseData, // 基础数据\n columnConfigMap, // 列配置\n height,\n}) => {\n const { x = [], table_head = [], table_body = [], x_field, group_by } = tableData;\n const chartContainerRef = useRef<HTMLDivElement | null>(null);\n const chartInstanceRef = useRef<echarts.ECharts | null>(null);\n\n // x 为空且 x_field 不在 table_head 中时判定为合计数据,x 轴只显示「合计」\n const index = table_head.indexOf(x_field);\n const isTotalData = x.length === 0 && index === -1;\n const effectiveX = isTotalData ? ['合计'] : x;\n\n const fullData = useMemo(() => {\n if (!metric || metric.length === 0) {\n return [];\n }\n // 存在维度时的数据处理\n if (group_by && group_by.length > 0) {\n // 如果存在已选维度为空,则不显示图表\n // if (\n // Array.isArray(groupBys) &&\n // groupBys.some((g) => Array.isArray(g.selected) && g.selected.length === 0) &&\n // reportType !== 4 // 分布分析时,维度为空代表选了总体\n // ) {\n // return [];\n // }\n // selected 有值时按该维度展开;selected 为空时代表全选,该维度做累计\n const validGroupBys = groupBys.filter((g) => Array.isArray(g.selected) && g.selected.length > 0);\n const validGroupByKeys = validGroupBys.map((g) => g.key);\n\n const metrics = cartesianProduct(metric, groupBys);\n const chartData: any[] = [];\n metrics.forEach((f) => {\n const groupBysText = groupBys\n .filter((g) => Array.isArray(g.selected) && g.selected.length > 0)\n .map((g) => f[g.key])\n .filter((value) => value !== null && value !== '')\n .join(',');\n\n const mItem = effectiveX.map((m) => {\n const obj: any = {};\n obj[x_field] = m;\n groupBys.forEach((g) => {\n obj[g.key] = f[g.key];\n });\n // 合计数据:仅按有选中的维度匹配并求和;否则按 x + 有选中的维度匹配。selected 为空的维度不参与匹配,等价于该维度做累计(总体)\n const matchKeys = isTotalData ? validGroupByKeys : [x_field, ...validGroupByKeys];\n // 当 matchKeys 为空(全部维度都是总体 / 或合计数据且无选中维度)时,直接对全表该指标求和\n const value =\n matchKeys.length > 0\n ? baseData\n .filter((d) => matchKeys.every((key) => obj[key] === d[key]))\n .reduce((sum, d) => sum + (Number(d[f.category]) || 0), 0)\n : baseData.reduce((sum, d) => sum + (Number(d[f.category]) || 0), 0);\n\n obj.value = value;\n obj.name = `${f.category}${groupBysText ? ',' + groupBysText : ''}`;\n obj.metricName = f.category;\n obj.format = columnConfigMap[f.category];\n obj.x = m;\n return obj;\n });\n chartData.push(...mItem);\n });\n return chartData;\n } else {\n const chartData: any[] = [];\n metric.forEach((m) => {\n effectiveX.forEach((item) => {\n if (isTotalData) {\n const value = baseData.reduce((sum, d) => sum + (Number(d[m]) || 0), 0);\n chartData.push({\n x: item,\n name: m,\n metricName: m,\n format: columnConfigMap[m],\n value,\n });\n } else {\n const row = table_body.find((d) => d[index] === item);\n const obj: any = {\n x: item,\n name: m,\n metricName: m,\n format: columnConfigMap[m],\n };\n table_head.forEach((key, i) => {\n obj[key] = row ? row[i] : 0;\n });\n obj.value = obj[m];\n chartData.push(obj);\n }\n });\n });\n return chartData;\n }\n }, [\n baseData,\n metric,\n groupBys,\n effectiveX,\n isTotalData,\n index,\n x_field,\n table_head,\n table_body,\n columnConfigMap,\n group_by,\n x,\n ]);\n\n // 获取y轴的格式化方式\n const yAxisFormatter = useMemo(() => {\n if (metric.length === 1) {\n return columnConfigMap[metric[0]]?.format;\n }\n return null;\n }, [metric, columnConfigMap]);\n\n // 获取series\n const series = useMemo(() => {\n const first = effectiveX[0];\n const firstData = fullData.filter((f) => f[x_field] === first);\n firstData.sort((a, b) => (b.value as number) - (a.value as number));\n const sortedMetric = Array.from(new Set(firstData.map((item: RowItem) => item.name)));\n const countMetric = (firstData.length > 0 ? (count ? sortedMetric.slice(0, count) : sortedMetric) : metric)\n .slice()\n .sort((a, b) => {\n const lowerA = getIntervalLower(String(a));\n const lowerB = getIntervalLower(String(b));\n if (!Number.isNaN(lowerA) && !Number.isNaN(lowerB)) return lowerA - lowerB;\n return String(a).localeCompare(String(b));\n });\n return countMetric.map((interval) => ({\n name: interval,\n type: 'line',\n smooth: true,\n stack: 'Total',\n areaStyle: {},\n showSymbol: true,\n symbol: 'emptyCircle',\n symbolSize: 0.8,\n lineStyle: {\n width: 1.5,\n },\n emphasis: {\n scale: 8,\n },\n data: effectiveX.map((item) => {\n const itemData = fullData.find((d) => d.name === interval && d.x === item);\n return itemData ? itemData.value : 0;\n }),\n }));\n }, [fullData, metric, count, effectiveX, x_field]);\n\n const grid = {\n top: 10,\n left: 0,\n right: 10,\n bottom: 40,\n containLabel: true,\n };\n const legend = {\n bottom: 0,\n type: 'scroll',\n itemWidth: 13,\n itemStyle: {\n opacity: 0,\n },\n lineStyle: {\n width: 2,\n type: 'solid',\n },\n };\n const xAxis = {\n type: 'category',\n data: effectiveX,\n axisLine: {\n lineStyle: {\n color: '#EBEEF4',\n },\n },\n axisLabel: {\n color: '#9CA4B3',\n fontSize: 12,\n },\n axisTick: {\n alignWithLabel: true,\n },\n boundaryGap: true,\n };\n const yAxis = {\n type: 'value',\n splitNumber: 4, // 设置Y轴坐标点数量\n axisLine: {\n show: true,\n lineStyle: {\n color: '#EBEEF4',\n shadowOffsetY: -10,\n shadowColor: '#EBEEF4',\n },\n },\n axisLabel: {\n color: '#999999',\n fontSize: 12,\n formatter: (value: number) => {\n if (yAxisFormatter === 'percent') {\n return new Decimal(value).mul(100) + '%';\n }\n if (yAxisFormatter === 'decimal') {\n return formatValue(value, yAxisFormatter);\n }\n const [result, unit] = formatNumber(value, true);\n return result + unit;\n },\n },\n splitLine: {\n lineStyle: {\n type: [2, 3], // 虚线\n color: '#E7E7E7', // 背景线颜色\n },\n },\n axisTick: {\n show: true,\n },\n };\n const tooltipFormatter = (params: any) => {\n const title = params[0]?.axisValue ?? '';\n const tooltipDom = (\n <div className={styles.tooltip}>\n <div className={styles.title}>{title}</div>\n <div className={styles.content}>\n {params.map((m: any) => {\n const metricName = m.seriesName.split(',')[0];\n const columnConfig = columnConfigMap[metricName];\n const format = columnConfig?.format ?? 'string'; // 使用可选链和默认值\n const showValue = format === 'currency' ? formatNumber(m.value, true) : formatValue(m.value, format);\n const showValueText = showValue === '' || showValue[0] === '' ? '-' : showValue;\n return (\n <div className={styles.item} key={m.seriesName}>\n <div className={styles.point} style={{ background: m.color }}></div>\n <div className={styles.category}>{m.seriesName}</div>\n <div className={styles.value}>{showValueText}</div>\n </div>\n );\n })}\n </div>\n </div>\n );\n return ReactDOMServer.renderToStaticMarkup(tooltipDom);\n };\n const tooltip = {\n trigger: 'axis',\n padding: 0,\n confine: true,\n enterable: true,\n axisPointer: {\n type: 'line', // 设置悬浮指针为线\n lineStyle: {\n color: '#EBEEF4', // 设置线的颜色\n type: 'dashed', // 设置虚线样式\n },\n },\n formatter: tooltipFormatter,\n };\n\n // 图表配置\n const chartOptions = useMemo(() => {\n return {\n color: chartColors,\n grid,\n legend: {\n ...legend,\n itemWidth: 13,\n itemStyle: {\n opacity: 0,\n },\n lineStyle: {\n width: 2,\n type: 'solid',\n },\n },\n xAxis,\n yAxis,\n series,\n tooltip,\n };\n }, [series]);\n\n // 初始化图表\n useEffect(() => {\n if (!chartContainerRef.current) return;\n let chart = chartInstanceRef.current;\n if (!chart) {\n chart = echarts.init(chartContainerRef.current);\n chartInstanceRef.current = chart;\n }\n chart?.setOption(chartOptions, true);\n return () => {\n if (chartInstanceRef.current) {\n chartInstanceRef.current.dispose();\n chartInstanceRef.current = null;\n }\n };\n }, [chartOptions]);\n\n // 监听图表容器大小变化\n useEffect(() => {\n const chartElement = chartContainerRef.current;\n if (!chartElement) return;\n const resizeObserver = new ResizeObserver(() => {\n const chart = chartInstanceRef.current;\n if (chart) {\n chart.resize();\n }\n });\n resizeObserver.observe(chartElement);\n return () => {\n resizeObserver.unobserve(chartElement);\n resizeObserver.disconnect();\n };\n }, [fullData]);\n\n return (\n <>\n {fullData.length > 0 ? (\n <div\n ref={chartContainerRef}\n className={styles.echarts}\n style={{ width: '100%', height: height || '100%', minHeight: 220 }}\n ></div>\n ) : (\n <Empty className={styles.empty} description='暂无数据' image={Empty.PRESENTED_IMAGE_SIMPLE} />\n )}\n </>\n );\n};\n\nexport default Line;\n"],
5
+ "mappings": "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",
6
+ "names": ["_a"]
7
+ }
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+ import type { ColumnConfig, GroupByItem, SqlMetaConfig, TableData } from './typing';
3
+ type RowItem = {
4
+ [key: string]: number | string;
5
+ };
6
+ type PageTypes = {
7
+ count?: number;
8
+ metric: string[];
9
+ groupBys: GroupByItem[];
10
+ tableData: TableData;
11
+ baseData: RowItem[];
12
+ columnConfigMap: {
13
+ [key: string]: ColumnConfig;
14
+ };
15
+ sqlFormatMap?: {
16
+ [key: string]: SqlMetaConfig;
17
+ };
18
+ height?: number;
19
+ };
20
+ declare const _default: React.NamedExoticComponent<PageTypes>;
21
+ export default _default;