@superad/ui 0.1.1

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 (343) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +42 -0
  3. package/es/Button/Button.d.mts +7 -0
  4. package/es/Button/Button.mjs +29 -0
  5. package/es/Button/Button.mjs.map +1 -0
  6. package/es/Button/index.d.mts +3 -0
  7. package/es/Button/index.d.ts +1 -0
  8. package/es/Button/index.js +1 -0
  9. package/es/Button/index.mjs +2 -0
  10. package/es/Button/style.mjs +33 -0
  11. package/es/Button/style.mjs.map +1 -0
  12. package/es/Button/type.d.mts +21 -0
  13. package/es/ConfigProvider/index.d.mts +9 -0
  14. package/es/ConfigProvider/index.d.ts +1 -0
  15. package/es/ConfigProvider/index.js +1 -0
  16. package/es/ConfigProvider/index.mjs +82 -0
  17. package/es/ConfigProvider/index.mjs.map +1 -0
  18. package/es/ConfigProvider/type.d.mts +24 -0
  19. package/es/DraggablePanel/DraggablePanel.d.mts +6 -0
  20. package/es/DraggablePanel/DraggablePanel.mjs +104 -0
  21. package/es/DraggablePanel/DraggablePanel.mjs.map +1 -0
  22. package/es/DraggablePanel/index.d.mts +3 -0
  23. package/es/DraggablePanel/index.d.ts +1 -0
  24. package/es/DraggablePanel/index.js +1 -0
  25. package/es/DraggablePanel/index.mjs +3 -0
  26. package/es/DraggablePanel/style.mjs +86 -0
  27. package/es/DraggablePanel/style.mjs.map +1 -0
  28. package/es/DraggablePanel/type.d.mts +27 -0
  29. package/es/Flex/Center.d.mts +7 -0
  30. package/es/Flex/Center.mjs +14 -0
  31. package/es/Flex/Center.mjs.map +1 -0
  32. package/es/Flex/FlexBasic.d.mts +6 -0
  33. package/es/Flex/FlexBasic.mjs +46 -0
  34. package/es/Flex/FlexBasic.mjs.map +1 -0
  35. package/es/Flex/Flexbox.d.mts +2 -0
  36. package/es/Flex/index.d.mts +5 -0
  37. package/es/Flex/index.d.ts +1 -0
  38. package/es/Flex/index.js +1 -0
  39. package/es/Flex/index.mjs +3 -0
  40. package/es/Flex/type.d.mts +35 -0
  41. package/es/Flex/utils.mjs +24 -0
  42. package/es/Flex/utils.mjs.map +1 -0
  43. package/es/FontLoader/index.d.mts +9 -0
  44. package/es/FontLoader/index.d.ts +1 -0
  45. package/es/FontLoader/index.js +1 -0
  46. package/es/FontLoader/index.mjs +23 -0
  47. package/es/FontLoader/index.mjs.map +1 -0
  48. package/es/GlobalFocusRing/index.d.mts +6 -0
  49. package/es/GlobalFocusRing/index.d.ts +1 -0
  50. package/es/GlobalFocusRing/index.js +1 -0
  51. package/es/GlobalFocusRing/index.mjs +204 -0
  52. package/es/GlobalFocusRing/index.mjs.map +1 -0
  53. package/es/GlobalFocusRing/style.mjs +35 -0
  54. package/es/GlobalFocusRing/style.mjs.map +1 -0
  55. package/es/Provider.d.mts +5 -0
  56. package/es/Table/canvas/canvasPalette.mjs +11 -0
  57. package/es/Table/canvas/canvasPalette.mjs.map +1 -0
  58. package/es/Table/canvas/chipPainters.mjs +408 -0
  59. package/es/Table/canvas/chipPainters.mjs.map +1 -0
  60. package/es/Table/canvas/controlPainters.mjs +193 -0
  61. package/es/Table/canvas/controlPainters.mjs.map +1 -0
  62. package/es/Table/canvas/groupTitle.mjs +181 -0
  63. package/es/Table/canvas/groupTitle.mjs.map +1 -0
  64. package/es/Table/canvas/paintUtils.mjs +70 -0
  65. package/es/Table/canvas/paintUtils.mjs.map +1 -0
  66. package/es/Table/canvas/rowSeries.mjs +130 -0
  67. package/es/Table/canvas/rowSeries.mjs.map +1 -0
  68. package/es/Table/canvas/textPainters.mjs +97 -0
  69. package/es/Table/canvas/textPainters.mjs.map +1 -0
  70. package/es/Table/canvas/theme.d.mts +14 -0
  71. package/es/Table/canvas/theme.mjs +276 -0
  72. package/es/Table/canvas/theme.mjs.map +1 -0
  73. package/es/Table/core/cellValue.d.mts +1 -0
  74. package/es/Table/core/cellValue.mjs +240 -0
  75. package/es/Table/core/cellValue.mjs.map +1 -0
  76. package/es/Table/core/rowSelection.mjs +138 -0
  77. package/es/Table/core/rowSelection.mjs.map +1 -0
  78. package/es/Table/core/size.mjs +60 -0
  79. package/es/Table/core/size.mjs.map +1 -0
  80. package/es/Table/core/tableI18n.d.mts +11 -0
  81. package/es/Table/core/tableI18n.mjs +123 -0
  82. package/es/Table/core/tableI18n.mjs.map +1 -0
  83. package/es/Table/core/tagTone.mjs +245 -0
  84. package/es/Table/core/tagTone.mjs.map +1 -0
  85. package/es/Table/core/zIndex.mjs +7 -0
  86. package/es/Table/core/zIndex.mjs.map +1 -0
  87. package/es/Table/index.d.mts +6 -0
  88. package/es/Table/index.d.ts +1 -0
  89. package/es/Table/index.js +1 -0
  90. package/es/Table/index.mjs +6 -0
  91. package/es/Table/react/Table.d.mts +9 -0
  92. package/es/Table/react/Table.mjs +407 -0
  93. package/es/Table/react/Table.mjs.map +1 -0
  94. package/es/Table/react/TableColumnSettings.mjs +65 -0
  95. package/es/Table/react/TableColumnSettings.mjs.map +1 -0
  96. package/es/Table/react/a11y.mjs +72 -0
  97. package/es/Table/react/a11y.mjs.map +1 -0
  98. package/es/Table/react/editors/base.mjs +427 -0
  99. package/es/Table/react/editors/base.mjs.map +1 -0
  100. package/es/Table/react/editors/inline.mjs +225 -0
  101. package/es/Table/react/editors/inline.mjs.map +1 -0
  102. package/es/Table/react/editors/picker.mjs +368 -0
  103. package/es/Table/react/editors/picker.mjs.map +1 -0
  104. package/es/Table/react/overlayChips.mjs +50 -0
  105. package/es/Table/react/overlayChips.mjs.map +1 -0
  106. package/es/Table/react/sameRenderInputs.mjs +50 -0
  107. package/es/Table/react/sameRenderInputs.mjs.map +1 -0
  108. package/es/Table/react/style.mjs +650 -0
  109. package/es/Table/react/style.mjs.map +1 -0
  110. package/es/Table/react/useTableCellEvents.mjs +32 -0
  111. package/es/Table/react/useTableCellEvents.mjs.map +1 -0
  112. package/es/Table/react/useTableColumnSettings.mjs +107 -0
  113. package/es/Table/react/useTableColumnSettings.mjs.map +1 -0
  114. package/es/Table/react/useTableEditorSync.mjs +41 -0
  115. package/es/Table/react/useTableEditorSync.mjs.map +1 -0
  116. package/es/Table/react/useTableHoverHint.mjs +62 -0
  117. package/es/Table/react/useTableHoverHint.mjs.map +1 -0
  118. package/es/Table/react/useTableKeyboard.mjs +41 -0
  119. package/es/Table/react/useTableKeyboard.mjs.map +1 -0
  120. package/es/Table/react/useTableRenderState.mjs +194 -0
  121. package/es/Table/react/useTableRenderState.mjs.map +1 -0
  122. package/es/Table/react/useTableScroll.mjs +33 -0
  123. package/es/Table/react/useTableScroll.mjs.map +1 -0
  124. package/es/Table/react/useTableSelectionInfo.mjs +48 -0
  125. package/es/Table/react/useTableSelectionInfo.mjs.map +1 -0
  126. package/es/Table/react/useTableVTableEvents.mjs +132 -0
  127. package/es/Table/react/useTableVTableEvents.mjs.map +1 -0
  128. package/es/Table/type.d.mts +279 -0
  129. package/es/Table/type.mjs +34 -0
  130. package/es/Table/type.mjs.map +1 -0
  131. package/es/Table/vtable/columns.d.mts +17 -0
  132. package/es/Table/vtable/columns.mjs +381 -0
  133. package/es/Table/vtable/columns.mjs.map +1 -0
  134. package/es/Table/vtable/frozenShadow.mjs +27 -0
  135. package/es/Table/vtable/frozenShadow.mjs.map +1 -0
  136. package/es/Table/vtable/interaction.mjs +175 -0
  137. package/es/Table/vtable/interaction.mjs.map +1 -0
  138. package/es/Table/vtable/option.d.mts +39 -0
  139. package/es/Table/vtable/option.mjs +232 -0
  140. package/es/Table/vtable/option.mjs.map +1 -0
  141. package/es/Table/vtable/seriesSelection.mjs +374 -0
  142. package/es/Table/vtable/seriesSelection.mjs.map +1 -0
  143. package/es/Table/vtable/vtableAdapter.mjs +96 -0
  144. package/es/Table/vtable/vtableAdapter.mjs.map +1 -0
  145. package/es/ThemeProvider/AppElementContext.d.mts +5 -0
  146. package/es/ThemeProvider/AppElementContext.mjs +10 -0
  147. package/es/ThemeProvider/AppElementContext.mjs.map +1 -0
  148. package/es/ThemeProvider/ConfigProvider.mjs +29 -0
  149. package/es/ThemeProvider/ConfigProvider.mjs.map +1 -0
  150. package/es/ThemeProvider/GlobalStyle/antdOverride.mjs +73 -0
  151. package/es/ThemeProvider/GlobalStyle/antdOverride.mjs.map +1 -0
  152. package/es/ThemeProvider/GlobalStyle/essential.mjs +50 -0
  153. package/es/ThemeProvider/GlobalStyle/essential.mjs.map +1 -0
  154. package/es/ThemeProvider/GlobalStyle/global.mjs +90 -0
  155. package/es/ThemeProvider/GlobalStyle/global.mjs.map +1 -0
  156. package/es/ThemeProvider/GlobalStyle/index.mjs +14 -0
  157. package/es/ThemeProvider/GlobalStyle/index.mjs.map +1 -0
  158. package/es/ThemeProvider/Meta.d.mts +7 -0
  159. package/es/ThemeProvider/Meta.mjs +48 -0
  160. package/es/ThemeProvider/Meta.mjs.map +1 -0
  161. package/es/ThemeProvider/ThemeProvider.d.mts +6 -0
  162. package/es/ThemeProvider/ThemeProvider.mjs +89 -0
  163. package/es/ThemeProvider/ThemeProvider.mjs.map +1 -0
  164. package/es/ThemeProvider/constants.d.mts +5 -0
  165. package/es/ThemeProvider/constants.mjs +6 -0
  166. package/es/ThemeProvider/constants.mjs.map +1 -0
  167. package/es/ThemeProvider/index.d.mts +6 -0
  168. package/es/ThemeProvider/index.d.ts +1 -0
  169. package/es/ThemeProvider/index.js +1 -0
  170. package/es/ThemeProvider/index.mjs +5 -0
  171. package/es/ThemeProvider/type.d.mts +48 -0
  172. package/es/_virtual/_rolldown/runtime.mjs +13 -0
  173. package/es/color/colors/blue.d.mts +6 -0
  174. package/es/color/colors/blue.mjs +67 -0
  175. package/es/color/colors/blue.mjs.map +1 -0
  176. package/es/color/colors/cyan.d.mts +6 -0
  177. package/es/color/colors/cyan.mjs +67 -0
  178. package/es/color/colors/cyan.mjs.map +1 -0
  179. package/es/color/colors/geekblue.d.mts +6 -0
  180. package/es/color/colors/geekblue.mjs +67 -0
  181. package/es/color/colors/geekblue.mjs.map +1 -0
  182. package/es/color/colors/gold.d.mts +6 -0
  183. package/es/color/colors/gold.mjs +67 -0
  184. package/es/color/colors/gold.mjs.map +1 -0
  185. package/es/color/colors/gray.d.mts +6 -0
  186. package/es/color/colors/gray.mjs +67 -0
  187. package/es/color/colors/gray.mjs.map +1 -0
  188. package/es/color/colors/green.d.mts +6 -0
  189. package/es/color/colors/green.mjs +67 -0
  190. package/es/color/colors/green.mjs.map +1 -0
  191. package/es/color/colors/index.d.mts +22 -0
  192. package/es/color/colors/index.mjs +35 -0
  193. package/es/color/colors/index.mjs.map +1 -0
  194. package/es/color/colors/lime.d.mts +6 -0
  195. package/es/color/colors/lime.mjs +67 -0
  196. package/es/color/colors/lime.mjs.map +1 -0
  197. package/es/color/colors/magenta.d.mts +6 -0
  198. package/es/color/colors/magenta.mjs +67 -0
  199. package/es/color/colors/magenta.mjs.map +1 -0
  200. package/es/color/colors/orange.d.mts +6 -0
  201. package/es/color/colors/orange.mjs +67 -0
  202. package/es/color/colors/orange.mjs.map +1 -0
  203. package/es/color/colors/primary.d.mts +6 -0
  204. package/es/color/colors/primary.mjs +67 -0
  205. package/es/color/colors/primary.mjs.map +1 -0
  206. package/es/color/colors/purple.d.mts +6 -0
  207. package/es/color/colors/purple.mjs +67 -0
  208. package/es/color/colors/purple.mjs.map +1 -0
  209. package/es/color/colors/red.d.mts +6 -0
  210. package/es/color/colors/red.mjs +67 -0
  211. package/es/color/colors/red.mjs.map +1 -0
  212. package/es/color/colors/volcano.d.mts +6 -0
  213. package/es/color/colors/volcano.mjs +67 -0
  214. package/es/color/colors/volcano.mjs.map +1 -0
  215. package/es/color/colors/yellow.d.mts +6 -0
  216. package/es/color/colors/yellow.mjs +67 -0
  217. package/es/color/colors/yellow.mjs.map +1 -0
  218. package/es/color/index.d.mts +23 -0
  219. package/es/color/index.d.ts +1 -0
  220. package/es/color/index.js +1 -0
  221. package/es/color/index.mjs +22 -0
  222. package/es/color/neutrals/index.d.mts +13 -0
  223. package/es/color/neutrals/index.mjs +17 -0
  224. package/es/color/neutrals/index.mjs.map +1 -0
  225. package/es/color/neutrals/mauve.d.mts +6 -0
  226. package/es/color/neutrals/mauve.mjs +67 -0
  227. package/es/color/neutrals/mauve.mjs.map +1 -0
  228. package/es/color/neutrals/olive.d.mts +6 -0
  229. package/es/color/neutrals/olive.mjs +67 -0
  230. package/es/color/neutrals/olive.mjs.map +1 -0
  231. package/es/color/neutrals/sage.d.mts +6 -0
  232. package/es/color/neutrals/sage.mjs +67 -0
  233. package/es/color/neutrals/sage.mjs.map +1 -0
  234. package/es/color/neutrals/sand.d.mts +6 -0
  235. package/es/color/neutrals/sand.mjs +67 -0
  236. package/es/color/neutrals/sand.mjs.map +1 -0
  237. package/es/color/neutrals/slate.d.mts +6 -0
  238. package/es/color/neutrals/slate.mjs +67 -0
  239. package/es/color/neutrals/slate.mjs.map +1 -0
  240. package/es/color/types.d.mts +16 -0
  241. package/es/eslint/index.d.mts +26 -0
  242. package/es/eslint/index.d.ts +1 -0
  243. package/es/eslint/index.js +1 -0
  244. package/es/eslint/index.mjs +11 -0
  245. package/es/eslint/index.mjs.map +1 -0
  246. package/es/hooks/useIsClient.d.mts +8 -0
  247. package/es/hooks/useIsClient.mjs +13 -0
  248. package/es/hooks/useIsClient.mjs.map +1 -0
  249. package/es/i18n/context.d.mts +7 -0
  250. package/es/i18n/context.mjs +16 -0
  251. package/es/i18n/context.mjs.map +1 -0
  252. package/es/i18n/index.d.mts +6 -0
  253. package/es/i18n/index.d.ts +1 -0
  254. package/es/i18n/index.js +1 -0
  255. package/es/i18n/index.mjs +5 -0
  256. package/es/i18n/resources/en/common.d.mts +35 -0
  257. package/es/i18n/resources/en/common.mjs +36 -0
  258. package/es/i18n/resources/en/common.mjs.map +1 -0
  259. package/es/i18n/resources/en/index.d.mts +7 -0
  260. package/es/i18n/resources/en/index.mjs +8 -0
  261. package/es/i18n/resources/en/index.mjs.map +1 -0
  262. package/es/i18n/resources/zhCn/common.d.mts +35 -0
  263. package/es/i18n/resources/zhCn/common.mjs +36 -0
  264. package/es/i18n/resources/zhCn/common.mjs.map +1 -0
  265. package/es/i18n/resources/zhCn/index.d.mts +7 -0
  266. package/es/i18n/resources/zhCn/index.mjs +8 -0
  267. package/es/i18n/resources/zhCn/index.mjs.map +1 -0
  268. package/es/i18n/types.d.mts +22 -0
  269. package/es/i18n/useTranslation.d.mts +12 -0
  270. package/es/i18n/useTranslation.mjs +22 -0
  271. package/es/i18n/useTranslation.mjs.map +1 -0
  272. package/es/index.d.mts +43 -0
  273. package/es/index.mjs +26 -0
  274. package/es/storybook/StoryBook/StoryBook.d.mts +7 -0
  275. package/es/storybook/StoryBook/StoryBook.mjs +52 -0
  276. package/es/storybook/StoryBook/StoryBook.mjs.map +1 -0
  277. package/es/storybook/StoryBook/index.d.mts +3 -0
  278. package/es/storybook/StoryBook/style.mjs +97 -0
  279. package/es/storybook/StoryBook/style.mjs.map +1 -0
  280. package/es/storybook/StoryBook/type.d.mts +13 -0
  281. package/es/storybook/index.d.mts +4 -0
  282. package/es/storybook/index.d.ts +1 -0
  283. package/es/storybook/index.js +1 -0
  284. package/es/storybook/index.mjs +2 -0
  285. package/es/styles/classNames.d.mts +11 -0
  286. package/es/styles/classNames.mjs +12 -0
  287. package/es/styles/classNames.mjs.map +1 -0
  288. package/es/styles/customTheme.d.mts +36 -0
  289. package/es/styles/customTheme.mjs +71 -0
  290. package/es/styles/customTheme.mjs.map +1 -0
  291. package/es/styles/index.d.mts +6 -0
  292. package/es/styles/index.d.ts +1 -0
  293. package/es/styles/index.js +1 -0
  294. package/es/styles/index.mjs +6 -0
  295. package/es/styles/theme/algorithms/darkAlgorithm.mjs +18 -0
  296. package/es/styles/theme/algorithms/darkAlgorithm.mjs.map +1 -0
  297. package/es/styles/theme/algorithms/lightAlgorithm.mjs +18 -0
  298. package/es/styles/theme/algorithms/lightAlgorithm.mjs.map +1 -0
  299. package/es/styles/theme/algorithms/resolveScales.mjs +25 -0
  300. package/es/styles/theme/algorithms/resolveScales.mjs.map +1 -0
  301. package/es/styles/theme/antdTheme.mjs +31 -0
  302. package/es/styles/theme/antdTheme.mjs.map +1 -0
  303. package/es/styles/theme/customStylish.d.mts +7 -0
  304. package/es/styles/theme/customStylish.mjs +158 -0
  305. package/es/styles/theme/customStylish.mjs.map +1 -0
  306. package/es/styles/theme/customStylishStatic.d.mts +6 -0
  307. package/es/styles/theme/customStylishStatic.mjs +156 -0
  308. package/es/styles/theme/customStylishStatic.mjs.map +1 -0
  309. package/es/styles/theme/customToken.d.mts +7 -0
  310. package/es/styles/theme/customToken.mjs +127 -0
  311. package/es/styles/theme/customToken.mjs.map +1 -0
  312. package/es/styles/theme/generateColorPalette.d.mts +16 -0
  313. package/es/styles/theme/generateColorPalette.mjs +170 -0
  314. package/es/styles/theme/generateColorPalette.mjs.map +1 -0
  315. package/es/styles/theme/token/base.mjs +64 -0
  316. package/es/styles/theme/token/base.mjs.map +1 -0
  317. package/es/styles/theme/token/dark.mjs +37 -0
  318. package/es/styles/theme/token/dark.mjs.map +1 -0
  319. package/es/styles/theme/token/light.mjs +37 -0
  320. package/es/styles/theme/token/light.mjs.map +1 -0
  321. package/es/types/customStylish.d.mts +28 -0
  322. package/es/types/customToken.d.mts +34 -0
  323. package/es/types/customToken.mjs +32 -0
  324. package/es/types/customToken.mjs.map +1 -0
  325. package/es/types/index.d.mts +15 -0
  326. package/es/types/index.d.ts +1 -0
  327. package/es/types/index.js +1 -0
  328. package/es/types/index.mjs +2 -0
  329. package/es/utils/composeEventHandlers.d.mts +5 -0
  330. package/es/utils/composeEventHandlers.mjs +10 -0
  331. package/es/utils/composeEventHandlers.mjs.map +1 -0
  332. package/es/utils/copyToClipboard.d.mts +5 -0
  333. package/es/utils/copyToClipboard.mjs +28 -0
  334. package/es/utils/copyToClipboard.mjs.map +1 -0
  335. package/es/utils/dom.d.mts +15 -0
  336. package/es/utils/dom.mjs +16 -0
  337. package/es/utils/dom.mjs.map +1 -0
  338. package/es/utils/genCdnUrl.d.mts +12 -0
  339. package/es/utils/genCdnUrl.mjs +17 -0
  340. package/es/utils/genCdnUrl.mjs.map +1 -0
  341. package/es/utils/safeReadableColor.mjs +6 -0
  342. package/es/utils/safeReadableColor.mjs.map +1 -0
  343. package/package.json +96 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interaction.mjs","names":[],"sources":["../../../src/Table/vtable/interaction.ts"],"sourcesContent":["import type { ListTable } from '@visactor/vtable';\n\nimport { DEFAULT_HIERARCHY_INDENT } from '../canvas/groupTitle';\nimport { hrefFor, isGroupTitleRecord, toBoolean, toRating, toValueList } from '../core/cellValue';\nimport { isPickerEditor, pickerJustClosed } from '../react/editors';\nimport type { SuperAdCellMarkers } from './columns';\nimport { toggleSeriesHeader, toggleSeriesRow } from './seriesSelection';\nimport {\n getEditingEditor,\n getInternalProps,\n isTableReleased,\n updateCellContent,\n updateNextFrame,\n} from './vtableAdapter';\n\n/**\n * 单元格里直接移除一个值 —— chip 上悬停出来的那个 × 走这条路(人员的姓名 chip、标签 chip)。\n *\n * 值写进 `getCellOriginRecord` 拿到的记录对象,再让引擎只重绘这一格,**不走\n * `changeCellValue`**:它在「分组 + 树」的嵌套行上会静默无操作,症状是「点了没反应,人还在」。\n * 口径与编辑器提交时一致(见 `writeBackOnCommit`)。\n *\n * `index` 是**记录原始数组**里的下标(与 `resolveUserEntries` / `layoutTagChips` 同一套编号)。\n * 值的容器类型保持使用方给的原样:数组仍是数组,单选写回首个剩余项、空了写 `''` —— 与 picker\n * 的 `publish` 同口径,避免「删一个值顺手把字段从 string 改成了数组」。\n */\nexport const removeChipAt = (\n table: ListTable,\n col: number,\n row: number,\n index: number,\n): boolean => {\n const record = table.getCellOriginRecord(col, row);\n const field = table.getBodyColumnDefine(col, row)?.field;\n if (record == null || typeof field !== 'string') return false;\n\n const current = record[field];\n const rest = toValueList(current).filter((_, position) => position !== index);\n record[field] = Array.isArray(current) ? rest : (rest[0] ?? '');\n updateCellContent(table, col, row);\n updateNextFrame(table);\n return true;\n};\n\nconst TREE_ICON_GAP = 4;\nexport type CellEditHint = {\n col: number;\n height: number;\n left: number;\n row: number;\n top: number;\n width: number;\n};\n\nexport const getGroupToggleCol = (table: ListTable, col: number, row: number) =>\n table.isSeriesNumber(col, row) ? col + 1 : col;\n\nexport const isTableEditing = (table: ListTable): boolean => Boolean(getEditingEditor(table));\n\nexport const sameEditHint = (left: CellEditHint | null, right: CellEditHint | null): boolean => {\n if (left === right) return true;\n if (!left || !right) return false;\n return (\n left.col === right.col &&\n left.row === right.row &&\n left.left === right.left &&\n left.top === right.top &&\n left.width === right.width &&\n left.height === right.height\n );\n};\nexport const resolveTreeTextOffset = (table: any, col: number, row: number): number => {\n const columnDefine = table?.getBodyColumnDefine?.(col, row);\n\n if (columnDefine?.tree !== true) return 0;\n\n const internalProps = getInternalProps(table);\n const layoutMap = internalProps?.layoutMap;\n const bodyHelper = internalProps?.bodyHelper;\n const showIndex = table?.getRecordShowIndexByCell?.(col, row);\n const indexKey = table?.dataSource?.getIndexKey?.(showIndex);\n const groupLength = table?.dataSource?.getGroupLength?.() ?? 0;\n let level = Array.isArray(indexKey) ? indexKey.length - 1 : 0;\n\n if (groupLength > 0) level = Math.max(0, level - groupLength);\n\n const indent = Math.max(0, level) * (layoutMap?.hierarchyIndent ?? DEFAULT_HIERARCHY_INDENT);\n const hasIcon = Boolean(bodyHelper?.getHierarchyIcon?.(col, row));\n const iconWidth = bodyHelper?.getHierarchyIconWidth?.() ?? 16;\n const style = table?.getCellStyle?.(col, row) as\n { padding?: number | (number | null)[] } | undefined;\n const padding = style?.padding;\n const paddingLeft = Array.isArray(padding)\n ? Number(padding[3] || 0)\n : typeof padding === 'number'\n ? padding\n : 0;\n\n return indent + (hasIcon ? iconWidth + TREE_ICON_GAP : 0) + paddingLeft;\n};\n\nexport const resolveEditHint = (\n table: ListTable,\n col: number,\n row: number,\n): CellEditHint | null => {\n if (isTableEditing(table)) return null;\n if (col < 0 || row < 0) return null;\n if (table.isHeader(col, row) || table.isSeriesNumber(col, row)) return null;\n if (isGroupTitleRecord(table.getCellOriginRecord(col, row))) return null;\n if (!table.getEditor(col, row)) return null;\n const rect = table.getCellRelativeRect(col, row);\n if (!rect || rect.width <= 0 || rect.height <= 0) return null;\n const treeOffset = resolveTreeTextOffset(table, col, row);\n const left = rect.left + treeOffset;\n const width = rect.width - treeOffset;\n\n if (width <= 0) return null;\n\n return { col, height: rect.height, left, row, top: rect.top, width };\n};\n\nexport const placeEditHint = (\n hint: CellEditHint | null,\n tableEl: Pick<HTMLElement, 'getBoundingClientRect'> | null,\n host: Pick<HTMLElement, 'getBoundingClientRect'> | null,\n): CellEditHint | null => {\n if (!hint || !tableEl || !host) return hint;\n const tableRect = tableEl.getBoundingClientRect();\n const hostRect = host.getBoundingClientRect();\n return {\n ...hint,\n left: hint.left + (tableRect.left - hostRect.left),\n top: hint.top + (tableRect.top - hostRect.top),\n };\n};\n\nexport const hintFromClientPoint = (\n table: ListTable,\n host: HTMLElement,\n clientX: number,\n clientY: number,\n): CellEditHint | null => {\n const tableEl = table.getElement();\n const rect = tableEl.getBoundingClientRect();\n const cell = table.getCellAtRelativePosition(clientX - rect.left, clientY - rect.top);\n if (!cell || cell.col < 0 || cell.row < 0) return null;\n return placeEditHint(resolveEditHint(table, cell.col, cell.row), tableEl, host);\n};\n\nconst writeCellValue = (table: ListTable, col: number, row: number, value: unknown) => {\n (\n table as ListTable & {\n changeCellValue: (nextCol: number, nextRow: number, next: unknown) => void;\n }\n ).changeCellValue(col, row, value);\n};\n\nconst resolveRatingStar = (\n table: ListTable,\n col: number,\n row: number,\n event?: MouseEvent | PointerEvent | TouchEvent,\n): number => {\n const rect = table.getCellRelativeRect(col, row);\n const offsetX = event != null && 'offsetX' in event ? event.offsetX : undefined;\n\n if (rect == null || rect.width <= 0 || typeof offsetX !== 'number') return 5;\n\n const ratio = (offsetX - rect.left) / rect.width;\n return Math.min(5, Math.max(1, Math.ceil(ratio * 5)));\n};\n\n/**\n * 去掉 URL 解析本来就会忽略的字符:空白、C0 控制字符与 DEL。按字面前缀匹配会被\n * `java\\tscript:` / ` javascript:` 绕过,所以匹配前先归一化。\n * 写成显式字符码而不是控制字符正则:这里要的正是「码点大于空格」这个精确条件。\n */\nconst stripUrlNoise = (href: string): string => {\n let out = '';\n for (const char of href) {\n const code = char.codePointAt(0) ?? 0;\n if (code > 0x20 && code !== 127) out += char;\n }\n return out;\n};\n\n/** 会执行脚本的协议。 */\nconst SCRIPT_URL = /^(?:javascript|vbscript):/i;\n\nconst isScriptUrl = (href: string): boolean => SCRIPT_URL.test(stripUrlNoise(href));\n\nconst openHref = (href: string) => {\n if (typeof document === 'undefined') return;\n // 链接列的取值常常来自业务数据,不能假设可信。**注意这里不是「修了一个 XSS」**:实测带\n // `target=\"_blank\"` 时 Chrome 本来就不会执行 `javascript:`(去掉本行也不会执行),实际症状是\n // 开出一个空白标签页。留着它是纵深防御 —— `target` 一旦改动、或浏览器行为变化,同一条路径\n // 就会变成真的执行(实测不带 `target` 时确实执行)。顺手也省掉了那个空白标签页。\n if (isScriptUrl(href)) return;\n\n const anchor = document.createElement('a');\n anchor.href = href;\n anchor.rel = 'noreferrer';\n anchor.target = '_blank';\n anchor.click();\n};\n\nconst handleSuperAdCellClick = (\n table: ListTable,\n args: { col: number; row: number; event?: MouseEvent | PointerEvent | TouchEvent },\n): boolean => {\n const define = table.getBodyColumnDefine?.(args.col, args.row) as SuperAdCellMarkers | undefined;\n const kind = define?.superadKind;\n\n if (define == null || kind == null) return false;\n\n const value = table.getCellOriginValue(args.col, args.row);\n\n if (kind === 'link') {\n if (define.superadEditable === true) return false;\n\n const href = hrefFor(define.superadLinkKind ?? 'link', value);\n if (href) openHref(href);\n return true;\n }\n\n if (define.superadEditable !== true) return false;\n\n if (kind === 'checkbox' || kind === 'boolean') {\n // 写布尔而不是 0/1:列的类型就是 boolean,写数字会把记录里的值静默改型,\n // 消费方用 `=== true` 判断或直接存 JSON 都会在切换一次之后失效。\n writeCellValue(table, args.col, args.row, toBoolean(value) !== true);\n return true;\n }\n\n if (kind === 'rating') {\n const current = toRating(value);\n const star = resolveRatingStar(table, args.col, args.row, args.event);\n\n writeCellValue(table, args.col, args.row, current === star ? 0 : star);\n return true;\n }\n\n return false;\n};\n\nexport const handleTableCellClick = (\n table: ListTable,\n args: {\n col: number;\n row: number;\n targetIcon?: unknown;\n event?: MouseEvent | PointerEvent | TouchEvent;\n },\n) => {\n if (table.isSeriesNumber?.(args.col, args.row)) {\n if (table.isHeader?.(args.col, args.row)) {\n toggleSeriesHeader(table);\n } else {\n toggleSeriesRow(\n table,\n args.row,\n (args.event as { shiftKey?: boolean } | undefined)?.shiftKey,\n );\n }\n\n return true;\n }\n\n const record = table.getCellOriginRecord(args.col, args.row);\n if (isGroupTitleRecord(record)) {\n if (args.targetIcon) return true;\n table.clearSelected();\n table.toggleHierarchyState(getGroupToggleCol(table, args.col, args.row), args.row);\n return true;\n }\n if (pickerJustClosed(table)) return true;\n if (handleSuperAdCellClick(table, args)) return true;\n if (!isPickerEditor(table.getEditor(args.col, args.row))) return false;\n // 0ms 定时器落地前表可能已经没了(容器塌成 0、路由切换)。startEditCell 会直接读\n // internalProps,释放后是 null。\n window.setTimeout(() => {\n if (isTableReleased(table)) return;\n table.startEditCell(args.col, args.row);\n }, 0);\n return false;\n};\n"],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { TableColumnInput, TableHover, TableRecord, TableSize } from "../type.mjs";
2
+ import { TableToken } from "../canvas/theme.mjs";
3
+ import { TableI18n } from "../core/tableI18n.mjs";
4
+ import { ThemeConfig } from "antd";
5
+ import { ListTableConstructorOptions } from "@visactor/vtable";
6
+ //#region src/Table/vtable/option.d.ts
7
+ interface CreateTableOptionInput {
8
+ autoFillWidth?: boolean;
9
+ columns?: TableColumnInput[];
10
+ editable?: boolean;
11
+ /** 编辑器那个独立 React root 要用的 antd 主题(见 `useTableRenderState`)。 */
12
+ editorTheme?: ThemeConfig;
13
+ emptyText?: string;
14
+ frozenColCount?: number;
15
+ groupBy?: string | string[];
16
+ groupTitleColors?: Record<string, string | undefined>;
17
+ headerRowHeight?: number | string;
18
+ hover?: TableHover;
19
+ /** 编辑器 / 空态占位读这份,独立 React root 拿不到外层 i18n。 */
20
+ i18n?: TableI18n;
21
+ option?: ListTableConstructorOptions;
22
+ records?: TableRecord[];
23
+ rowDrag?: boolean;
24
+ rowHeight?: number | string;
25
+ showHeader?: boolean;
26
+ showRowIndex?: boolean;
27
+ showRowSelection?: boolean;
28
+ showVerticalBorder?: boolean;
29
+ size?: TableSize;
30
+ theme?: ListTableConstructorOptions['theme'];
31
+ token?: TableToken;
32
+ tree?: boolean;
33
+ treeExpandLevel?: number;
34
+ treeIndent?: number;
35
+ }
36
+ declare const createTableOption: ({ autoFillWidth, columns, editable, emptyText, frozenColCount, groupBy, groupTitleColors, headerRowHeight, hover, option, records, rowDrag, rowHeight, showHeader, showRowIndex, showRowSelection, showVerticalBorder, size, theme, token, editorTheme, i18n, tree, treeExpandLevel, treeIndent }: CreateTableOptionInput) => ListTableConstructorOptions;
37
+ //#endregion
38
+ export { CreateTableOptionInput, createTableOption };
39
+ //# sourceMappingURL=option.d.mts.map
@@ -0,0 +1,232 @@
1
+ import { TABLE_CHROME, resolveGroupFill, resolveTableCanvasPalette } from "../canvas/theme.mjs";
2
+ import { isGroupTitleRecord, resolveOption } from "../core/cellValue.mjs";
3
+ import { getLayoutMapHierarchyIndent } from "./vtableAdapter.mjs";
4
+ import { countGroupRecords, createGroupTitleTagLayout, getGroupByField, getGroupTitleLevel } from "../canvas/groupTitle.mjs";
5
+ import { isGroupTitleRow, resolveRowSeriesValue } from "./seriesSelection.mjs";
6
+ import { createRowSeriesHeaderLayout, createRowSeriesLayout } from "../canvas/rowSeries.mjs";
7
+ import { TABLE_ROW_HEIGHT } from "../type.mjs";
8
+ import { parsePxSize } from "../core/size.mjs";
9
+ import { compileColumns, withDefaultColumnMinWidths } from "./columns.mjs";
10
+ //#region src/Table/vtable/option.ts
11
+ const hoverOption = (hover) => {
12
+ if (!hover) return void 0;
13
+ if (hover === "none") return { disableHover: true };
14
+ return { highlightMode: hover };
15
+ };
16
+ const groupTitleFieldFormat = (groupBy, columns) => {
17
+ return (record, col, row, table) => {
18
+ const level = getGroupTitleLevel(table, col ?? 0, row ?? 0);
19
+ const field = getGroupByField(groupBy, level);
20
+ const options = (columns?.find((item) => "field" in item && item.field === field))?.options;
21
+ const raw = record?.vtableMergeName;
22
+ const label = options ? resolveOption(raw, options).label : raw == null ? "" : String(raw);
23
+ const count = countGroupRecords(record);
24
+ return count ? `${label} (${count})` : label;
25
+ };
26
+ };
27
+ /**
28
+ * VTable 默认会把树/分组的展开图标画进行号列。关闭行选择后行号列退回默认渲染,
29
+ * 分组标题行会被默认样式/展开图标覆盖。这里只接管分组标题行;数据行继续交回
30
+ * 默认渲染,保留 `dragOrder` 手柄与 `format` 序号。
31
+ */
32
+ const groupTitleSeriesLayout = (showIndex, showSelection) => {
33
+ const render = createRowSeriesLayout(showIndex, showSelection);
34
+ return (args) => isGroupTitleRow(args.table, args.row ?? 0) ? render(args) : { renderDefault: true };
35
+ };
36
+ const rowSeriesNumber = ({ dragOrder, groupBackground, grouped, showIndex, showSelection, showVerticalBorder, token }) => ({
37
+ customLayout: showSelection ? createRowSeriesLayout(Boolean(showIndex), true, Boolean(dragOrder)) : grouped ? groupTitleSeriesLayout(Boolean(showIndex), Boolean(showSelection)) : void 0,
38
+ disableColumnResize: true,
39
+ dragOrder: Boolean(dragOrder),
40
+ format: showSelection !== true ? (_col, row, table) => {
41
+ if (row == null) return "";
42
+ if (showIndex !== true && dragOrder === true) return "";
43
+ return resolveRowSeriesValue(table, row);
44
+ } : dragOrder === true ? () => "" : void 0,
45
+ headerCustomLayout: showSelection ? createRowSeriesHeaderLayout(Boolean(showIndex), Boolean(dragOrder)) : void 0,
46
+ headerStyle: {
47
+ bgColor: token?.colorBgContainer,
48
+ borderLineWidth: showVerticalBorder ? [
49
+ 0,
50
+ 1,
51
+ 0,
52
+ 0
53
+ ] : [
54
+ 0,
55
+ 0,
56
+ 0,
57
+ 0
58
+ ],
59
+ color: token?.colorTextSecondary ?? TABLE_CHROME.textAux,
60
+ fontSize: 13,
61
+ fontWeight: 500,
62
+ textAlign: "center"
63
+ },
64
+ style: (args) => {
65
+ const record = args.table.getCellOriginRecord(args.col, args.row);
66
+ return {
67
+ bgColor: Boolean(record?.vtableMerge) || isGroupTitleRow(args.table, args.row) ? groupBackground : token?.colorBgContainer ?? "#ffffff",
68
+ borderLineWidth: showVerticalBorder ? [
69
+ 1,
70
+ 1,
71
+ 0,
72
+ 0
73
+ ] : [
74
+ 1,
75
+ 0,
76
+ 0,
77
+ 0
78
+ ],
79
+ color: showIndex ? token?.colorText ?? TABLE_CHROME.text : token?.colorTextTertiary ?? TABLE_CHROME.textMuted,
80
+ fontSize: 14,
81
+ textAlign: "center"
82
+ };
83
+ },
84
+ title: showIndex ? "序号" : "",
85
+ width: showSelection ? showIndex ? dragOrder ? 64 : 52 : dragOrder ? 52 : 44 : dragOrder && showIndex ? 48 : 36
86
+ });
87
+ const createTableOption = ({ autoFillWidth, columns, editable, emptyText, frozenColCount, groupBy, groupTitleColors, headerRowHeight, hover, option, records, rowDrag, rowHeight, showHeader, showRowIndex, showRowSelection, showVerticalBorder, size = "middle", theme, token, editorTheme, i18n, tree, treeExpandLevel, treeIndent }) => {
88
+ const density = parsePxSize(rowHeight) ?? TABLE_ROW_HEIGHT[size];
89
+ const groupTitleBackground = theme?.groupTitleStyle?.bgColor;
90
+ const groupBackground = typeof groupTitleBackground === "string" ? groupTitleBackground : resolveGroupFill(token);
91
+ const hasTree = Boolean(tree || columns?.some((column) => "tree" in column && column.tree));
92
+ const compiled = compileColumns(columns, {
93
+ editable,
94
+ groupedTree: Boolean(hasTree && (groupBy ?? option?.groupBy)),
95
+ i18n,
96
+ token,
97
+ tree: hasTree
98
+ }) ?? withDefaultColumnMinWidths(option?.columns);
99
+ const shouldEdit = Boolean(editable || columns?.some((column) => "editable" in column && column.editable));
100
+ const grouped = groupBy ?? option?.groupBy;
101
+ const groupedFields = typeof grouped === "string" || Array.isArray(grouped) ? grouped : void 0;
102
+ const compiledWithGroupIndent = (() => {
103
+ if (grouped === void 0 || compiled === void 0) return compiled;
104
+ const treeColumn = compiled.find((column) => column.tree === true);
105
+ const target = treeColumn || compiled[0];
106
+ if (target === void 0) return compiled;
107
+ const useTreePadding = treeColumn !== void 0;
108
+ return compiled.map((column) => {
109
+ if (column !== target) return column;
110
+ const define = column;
111
+ return {
112
+ ...define,
113
+ style: (args) => {
114
+ const base = typeof define.style === "function" ? define.style(args) : define.style || {};
115
+ const record = args.table.getCellOriginRecord(args.col, args.row);
116
+ if (isGroupTitleRecord(record) || useTreePadding) return base;
117
+ const groupFields = Array.isArray(grouped) ? grouped.length : 1;
118
+ const indent = getLayoutMapHierarchyIndent(args.table) ?? 20;
119
+ return {
120
+ ...base,
121
+ padding: [
122
+ 0,
123
+ 8,
124
+ 0,
125
+ 26 + Math.max(0, groupFields - 1) * indent
126
+ ]
127
+ };
128
+ }
129
+ };
130
+ });
131
+ })();
132
+ const callerSeriesObject = option?.rowSeriesNumber;
133
+ const needSeries = Boolean(showRowIndex || rowDrag || showRowSelection || option?.rowSeriesNumber);
134
+ const resolvedFrozenColCount = frozenColCount != null && frozenColCount > 0 ? frozenColCount + (needSeries ? 1 : 0) : frozenColCount ?? option?.frozenColCount ?? 0;
135
+ const seriesOption = (() => {
136
+ if (needSeries === false) return void 0;
137
+ const built = rowSeriesNumber({
138
+ dragOrder: rowDrag,
139
+ groupBackground,
140
+ grouped: grouped !== void 0,
141
+ showIndex: showRowIndex,
142
+ showSelection: showRowSelection,
143
+ showVerticalBorder,
144
+ token
145
+ });
146
+ const merged = {
147
+ ...built,
148
+ ...callerSeriesObject
149
+ };
150
+ if (built.headerCustomLayout != null) {
151
+ merged.cellType = void 0;
152
+ merged.headerType = void 0;
153
+ }
154
+ return merged;
155
+ })();
156
+ return {
157
+ ...option,
158
+ emptyTip: { text: emptyText ?? (option?.emptyTip)?.text ?? "No data" },
159
+ autoFillWidth: autoFillWidth ?? option?.autoFillWidth ?? true,
160
+ columns: compiledWithGroupIndent,
161
+ customConfig: {
162
+ ...option?.customConfig,
163
+ __superadPalette: resolveTableCanvasPalette(token),
164
+ __superadI18n: i18n,
165
+ __superadTheme: editorTheme,
166
+ createReactContainer: true
167
+ },
168
+ defaultHeaderRowHeight: parsePxSize(headerRowHeight) ?? option?.defaultHeaderRowHeight ?? 36,
169
+ defaultRowHeight: parsePxSize(rowHeight) ?? option?.defaultRowHeight ?? density,
170
+ editCellTrigger: shouldEdit ? option?.editCellTrigger ?? [
171
+ "click",
172
+ "doubleclick",
173
+ "keydown",
174
+ "api"
175
+ ] : option?.editCellTrigger,
176
+ excelOptions: shouldEdit ? {
177
+ fillHandle: false,
178
+ ...option?.excelOptions
179
+ } : option?.excelOptions,
180
+ frozenColCount: resolvedFrozenColCount,
181
+ unfreezeAllOnExceedsMaxWidth: option?.unfreezeAllOnExceedsMaxWidth ?? false,
182
+ groupBy: grouped,
183
+ groupConfig: grouped ? {
184
+ ...option?.groupConfig,
185
+ enableTreeStickCell: true,
186
+ groupBy: grouped,
187
+ titleCheckbox: Boolean(showRowSelection) || needSeries,
188
+ titleCustomLayout: option?.groupConfig?.titleCustomLayout || (groupedFields ? createGroupTitleTagLayout({
189
+ colors: groupTitleColors,
190
+ columns,
191
+ groupBy: groupedFields
192
+ }) : void 0),
193
+ titleFieldFormat: option?.groupConfig?.titleFieldFormat || (grouped ? () => String.fromCharCode(8203) : void 0)
194
+ } : option?.groupConfig,
195
+ groupTitleFieldFormat: groupedFields ? groupTitleFieldFormat(groupedFields, columns) : option?.groupTitleFieldFormat,
196
+ enableCheckboxCascade: option?.enableCheckboxCascade ?? true,
197
+ enableHeaderCheckboxCascade: Boolean(showRowSelection && (grouped || hasTree)) || Boolean(option?.enableHeaderCheckboxCascade),
198
+ enableTreeStickCell: Boolean(grouped) || option?.enableTreeStickCell,
199
+ enableTreeNodeMerge: grouped ? true : option?.enableTreeNodeMerge,
200
+ hierarchyExpandLevel: grouped ? option?.hierarchyExpandLevel ?? Number.POSITIVE_INFINITY : hasTree ? treeExpandLevel ?? option?.hierarchyExpandLevel ?? 1 : option?.hierarchyExpandLevel,
201
+ hierarchyIndent: hasTree ? treeIndent ?? option?.hierarchyIndent ?? 16 : option?.hierarchyIndent,
202
+ hierarchyTextStartAlignment: hasTree ? true : option?.hierarchyTextStartAlignment,
203
+ hover: hoverOption(hover) ?? option?.hover ?? { highlightMode: "row" },
204
+ keyboardOptions: {
205
+ copySelected: true,
206
+ ...shouldEdit ? {
207
+ editCellOnEnter: true,
208
+ pasteValueToCell: true,
209
+ selectAllOnCtrlA: true
210
+ } : void 0,
211
+ ...option?.keyboardOptions
212
+ },
213
+ records: records ?? option?.records,
214
+ rowSeriesNumber: seriesOption,
215
+ select: {
216
+ blankAreaClickDeselect: true,
217
+ headerSelectMode: "cell",
218
+ highlightMode: "cell",
219
+ ...option?.select,
220
+ disableSelect: option?.select?.disableSelect
221
+ },
222
+ showHeader: showHeader ?? option?.showHeader ?? true,
223
+ theme: {
224
+ ...option?.theme,
225
+ ...theme
226
+ }
227
+ };
228
+ };
229
+ //#endregion
230
+ export { createTableOption };
231
+
232
+ //# sourceMappingURL=option.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"option.mjs","names":[],"sources":["../../../src/Table/vtable/option.ts"],"sourcesContent":["import type { ListTableConstructorOptions } from '@visactor/vtable';\nimport type { ThemeConfig } from 'antd';\n\nimport {\n countGroupRecords,\n createGroupTitleTagLayout,\n DEFAULT_HIERARCHY_INDENT,\n getGroupByField,\n getGroupTitleLevel,\n GROUP_TITLE_CHIP_INSET,\n} from '../canvas/groupTitle';\nimport { createRowSeriesHeaderLayout, createRowSeriesLayout } from '../canvas/rowSeries';\nimport {\n resolveGroupFill,\n resolveTableCanvasPalette,\n TABLE_CHROME,\n type TableToken,\n} from '../canvas/theme';\nimport { isGroupTitleRecord, resolveOption } from '../core/cellValue';\nimport { parsePxSize } from '../core/size';\nimport type { TableI18n } from '../core/tableI18n';\nimport {\n TABLE_HEADER_HEIGHT,\n TABLE_ROW_HEIGHT,\n type TableColumnInput,\n type TableHover,\n type TableRecord,\n type TableSize,\n} from '../type';\nimport { compileColumns, withDefaultColumnMinWidths } from './columns';\nimport { isGroupTitleRow, resolveRowSeriesValue } from './seriesSelection';\nimport { getLayoutMapHierarchyIndent } from './vtableAdapter';\n\nexport interface CreateTableOptionInput {\n autoFillWidth?: boolean;\n columns?: TableColumnInput[];\n editable?: boolean;\n /** 编辑器那个独立 React root 要用的 antd 主题(见 `useTableRenderState`)。 */\n editorTheme?: ThemeConfig;\n emptyText?: string;\n frozenColCount?: number;\n groupBy?: string | string[];\n groupTitleColors?: Record<string, string | undefined>;\n headerRowHeight?: number | string;\n hover?: TableHover;\n /** 编辑器 / 空态占位读这份,独立 React root 拿不到外层 i18n。 */\n i18n?: TableI18n;\n option?: ListTableConstructorOptions;\n records?: TableRecord[];\n rowDrag?: boolean;\n rowHeight?: number | string;\n showHeader?: boolean;\n showRowIndex?: boolean;\n showRowSelection?: boolean;\n showVerticalBorder?: boolean;\n size?: TableSize;\n theme?: ListTableConstructorOptions['theme'];\n token?: TableToken;\n tree?: boolean;\n treeExpandLevel?: number;\n treeIndent?: number;\n}\n\nconst hoverOption = (hover?: TableHover): ListTableConstructorOptions['hover'] => {\n if (!hover) return undefined;\n if (hover === 'none') return { disableHover: true };\n return { highlightMode: hover };\n};\n\nconst groupTitleFieldFormat = (groupBy: string | string[], columns?: TableColumnInput[]) => {\n return (\n record: { children?: unknown[]; vtableMergeName?: unknown },\n col?: number,\n row?: number,\n table?: unknown,\n ) => {\n const level = getGroupTitleLevel(table, col ?? 0, row ?? 0);\n const field = getGroupByField(groupBy, level);\n const column = columns?.find((item) => 'field' in item && item.field === field) as\n { options?: { color?: string; label: string; value: string }[] } | undefined;\n const options = column?.options;\n const raw = record?.vtableMergeName;\n const label = options ? resolveOption(raw, options).label : raw == null ? '' : String(raw);\n const count = countGroupRecords(record);\n return count ? `${label} (${count})` : label;\n };\n};\n\n/**\n * VTable 默认会把树/分组的展开图标画进行号列。关闭行选择后行号列退回默认渲染,\n * 分组标题行会被默认样式/展开图标覆盖。这里只接管分组标题行;数据行继续交回\n * 默认渲染,保留 `dragOrder` 手柄与 `format` 序号。\n */\nconst groupTitleSeriesLayout = (\n showIndex: boolean,\n showSelection: boolean,\n): ReturnType<typeof createRowSeriesLayout> => {\n const render = createRowSeriesLayout(showIndex, showSelection);\n\n return (args) =>\n isGroupTitleRow(args.table, args.row ?? 0)\n ? render(args)\n : ({ renderDefault: true } as unknown as ReturnType<typeof render>);\n};\n\ninterface RowSeriesNumberInput {\n dragOrder?: boolean;\n groupBackground?: string;\n grouped?: boolean;\n showIndex?: boolean;\n showSelection?: boolean;\n showVerticalBorder?: boolean;\n token?: TableToken;\n}\n\nconst rowSeriesNumber = ({\n dragOrder,\n groupBackground,\n grouped,\n showIndex,\n showSelection,\n showVerticalBorder,\n token,\n}: RowSeriesNumberInput): NonNullable<ListTableConstructorOptions['rowSeriesNumber']> => ({\n customLayout: showSelection\n ? createRowSeriesLayout(Boolean(showIndex), true, Boolean(dragOrder))\n : grouped\n ? groupTitleSeriesLayout(Boolean(showIndex), Boolean(showSelection))\n : undefined,\n disableColumnResize: true,\n dragOrder: Boolean(dragOrder),\n // 没开行选择时走 VTable `format` 出序号。开了行选择则 painter 自己画数字,\n // format 必须交空串:拖拽列 `renderDefault: true` 会把 format 文字和手柄一起画出来。\n format:\n showSelection !== true\n ? (_col?: number, row?: number, table?: unknown) => {\n if (row == null) return '';\n if (showIndex !== true && dragOrder === true) return '';\n return resolveRowSeriesValue(table, row);\n }\n : dragOrder === true\n ? () => ''\n : undefined,\n headerCustomLayout: showSelection\n ? createRowSeriesHeaderLayout(Boolean(showIndex), Boolean(dragOrder))\n : undefined,\n headerStyle: {\n bgColor: token?.colorBgContainer,\n borderLineWidth: (showVerticalBorder ? [0, 1, 0, 0] : [0, 0, 0, 0]) as [\n number,\n number,\n number,\n number,\n ],\n color: token?.colorTextSecondary ?? TABLE_CHROME.textAux,\n fontSize: 13,\n fontWeight: 500,\n textAlign: 'center',\n },\n style: (args) => {\n const record = args.table.getCellOriginRecord(args.col, args.row) as\n { vtableMerge?: boolean } | undefined;\n const grouped = Boolean(record?.vtableMerge) || isGroupTitleRow(args.table, args.row);\n return {\n bgColor: grouped ? groupBackground : (token?.colorBgContainer ?? '#ffffff'),\n borderLineWidth: (showVerticalBorder ? [1, 1, 0, 0] : [1, 0, 0, 0]) as [\n number,\n number,\n number,\n number,\n ],\n color: showIndex\n ? (token?.colorText ?? TABLE_CHROME.text)\n : (token?.colorTextTertiary ?? TABLE_CHROME.textMuted),\n fontSize: 14,\n textAlign: 'center',\n };\n },\n title: showIndex ? '序号' : '',\n // 行号列只放手柄 / 序号 / 复选框,按内容收,避免在窄 demo 里占掉一整块。\n width: showSelection\n ? showIndex\n ? dragOrder\n ? 64\n : 52\n : dragOrder\n ? 52\n : 44\n : dragOrder && showIndex\n ? 48\n : 36,\n});\n\nexport const createTableOption = ({\n autoFillWidth,\n columns,\n editable,\n emptyText,\n frozenColCount,\n groupBy,\n groupTitleColors,\n headerRowHeight,\n hover,\n option,\n records,\n rowDrag,\n rowHeight,\n showHeader,\n showRowIndex,\n showRowSelection,\n showVerticalBorder,\n size = 'middle',\n theme,\n token,\n editorTheme,\n i18n,\n tree,\n treeExpandLevel,\n treeIndent,\n}: CreateTableOptionInput): ListTableConstructorOptions => {\n const density = parsePxSize(rowHeight) ?? TABLE_ROW_HEIGHT[size];\n const groupTitleBackground = theme?.groupTitleStyle?.bgColor;\n const groupBackground =\n typeof groupTitleBackground === 'string' ? groupTitleBackground : resolveGroupFill(token);\n const hasTree = Boolean(tree || columns?.some((column) => 'tree' in column && column.tree));\n const compiled =\n compileColumns(columns, {\n editable,\n groupedTree: Boolean(hasTree && (groupBy ?? option?.groupBy)),\n i18n,\n token,\n tree: hasTree,\n }) ?? withDefaultColumnMinWidths(option?.columns);\n const shouldEdit = Boolean(\n editable || columns?.some((column) => 'editable' in column && column.editable),\n );\n const grouped = groupBy ?? option?.groupBy;\n // `grouped` 还可能是 VTable 的 GroupConfig 对象;下面几处需要的是「按哪些字段分组」,\n // 拿不到字段时就不接管,交回 option 自己的 groupConfig。\n const groupedFields =\n typeof grouped === 'string' || Array.isArray(grouped)\n ? (grouped as string | string[])\n : undefined;\n\n const compiledWithGroupIndent = (() => {\n if (grouped === undefined || compiled === undefined) return compiled;\n\n const treeColumn = compiled.find((column) => (column as { tree?: boolean }).tree === true);\n const target = treeColumn || compiled[0];\n\n if (target === undefined) return compiled;\n\n const useTreePadding = treeColumn !== undefined;\n\n return compiled.map((column) => {\n if (column !== target) return column;\n\n const define = column as { style?: unknown };\n\n return {\n ...define,\n style: (args: any) => {\n const base = typeof define.style === 'function' ? define.style(args) : define.style || {};\n const record = args.table.getCellOriginRecord(args.col, args.row);\n\n if (isGroupTitleRecord(record) || useTreePadding) return base;\n\n const groupFields = Array.isArray(grouped) ? grouped.length : 1;\n // Read the live indent, not a constant: the canvas chip indents by\n // getGroupTitleIndent, which reads the same value, so a custom hierarchyIndent has\n // to move both or the chip and its cell padding drift apart.\n const indent = getLayoutMapHierarchyIndent(args.table) ?? DEFAULT_HIERARCHY_INDENT;\n\n return {\n ...base,\n padding: [0, 8, 0, GROUP_TITLE_CHIP_INSET + Math.max(0, groupFields - 1) * indent],\n };\n },\n } as never;\n });\n })();\n // 使用方自己传 `option.rowSeriesNumber` 时 VTable 同样会渲出那一列,冻结列数必须一并 +1,\n // 否则冻住的是行号列而不是第一个数据列。\n // 公开类型只收单个对象(`IRowSeriesNumber`)。运行时的 Array.isArray 分支不在这里跟随:\n // 照内部实现去猜一套公开类型没承诺的用法,正是本文件一直在清理的那类耦合。\n const callerSeriesObject = option?.rowSeriesNumber;\n const needSeries = Boolean(\n showRowIndex || rowDrag || showRowSelection || option?.rowSeriesNumber,\n );\n // `frozenColCount` 描述的是冻结多少个数据列;VTable 会把行号/拖动列也算进去,\n // 因此存在行号列时要 +1,使冻结列从内容第一列(视觉上的第二列)开始。\n const seriesColCount = needSeries ? 1 : 0;\n const resolvedFrozenColCount =\n frozenColCount != null && frozenColCount > 0\n ? frozenColCount + seriesColCount\n : (frozenColCount ?? option?.frozenColCount ?? 0);\n const seriesOption = (() => {\n if (needSeries === false) return undefined;\n\n const built = rowSeriesNumber({\n dragOrder: rowDrag,\n groupBackground,\n grouped: grouped !== undefined,\n showIndex: showRowIndex,\n showSelection: showRowSelection,\n showVerticalBorder,\n token,\n });\n // 使用方传进来的字段叠在最上面(与本文其他 `...option?.x` 的方向一致)。之前这里是三元的\n // 另一支,等于整个丢弃 —— 自定义 field / cellType / title 静默失效,而列照样渲出来,最难查。\n const merged = { ...built, ...callerSeriesObject };\n\n // 行号列的复选框(含表头那个)是我们在 canvas 上画的。使用方再传 `cellType: 'checkbox'`\n // 会让引擎按它自己的渲染器**再画一个** —— 实测同一格里同时出现引擎的 \"checkbox\" 与我们的\n // \"rect\"/\"image\"/\"text\" 两套图形。我们自己画的时候就把渲染方式收回来。\n // 注意只在 `built.headerCustomLayout` 存在时收回:`showRowSelection: false` 时\n // 行号列交回引擎,使用方要的正是原生复选框 / `dragOrder` 手柄,必须透传。\n // 开了行选择时即使同时开 `rowDrag`,painter 仍在,只是 `renderDefault: true` 让引擎画手柄。\n if (built.headerCustomLayout != null) {\n merged.cellType = undefined;\n merged.headerType = undefined;\n }\n\n return merged;\n })();\n\n return {\n ...option,\n emptyTip: {\n text: emptyText ?? (option?.emptyTip as { text?: string } | undefined)?.text ?? 'No data',\n },\n autoFillWidth: autoFillWidth ?? option?.autoFillWidth ?? true,\n columns: compiledWithGroupIndent,\n customConfig: {\n ...option?.customConfig,\n __superadPalette: resolveTableCanvasPalette(token),\n // 编辑器在独立 React root 里渲染,取不到外层主题 / i18n,只能从表实例上读回。\n __superadI18n: i18n,\n __superadTheme: editorTheme,\n createReactContainer: true,\n } as never,\n defaultHeaderRowHeight:\n parsePxSize(headerRowHeight) ?? option?.defaultHeaderRowHeight ?? TABLE_HEADER_HEIGHT,\n defaultRowHeight: parsePxSize(rowHeight) ?? option?.defaultRowHeight ?? density,\n editCellTrigger: shouldEdit\n ? (option?.editCellTrigger ?? ['click', 'doubleclick', 'keydown', 'api'])\n : option?.editCellTrigger,\n excelOptions: shouldEdit\n ? { fillHandle: false, ...option?.excelOptions }\n : option?.excelOptions,\n frozenColCount: resolvedFrozenColCount,\n // VTable 默认在冻结区超过表宽 80% 时把冻结列**全部**解冻,`frozenColCount` 于是静默\n // 变成 0 列(窄容器 + 宽列必然踩中)。改走它的另一条路径:冻到装得下为止。\n // 要用回 VTable 的行为,传 `option={{ unfreezeAllOnExceedsMaxWidth: true }}`。\n unfreezeAllOnExceedsMaxWidth: option?.unfreezeAllOnExceedsMaxWidth ?? false,\n groupBy: grouped,\n groupConfig: grouped\n ? {\n ...option?.groupConfig,\n enableTreeStickCell: true,\n groupBy: grouped,\n // VTable 只有在 `titleCheckbox` 为真时才把分组标题的合并起点放到行号列之后。\n // 只要存在行号/拖拽列,就必须抬起合并起点,否则分组标题的 tag 与展开图标\n // 会跨过行号列,覆盖分组行的样式与内容。真正的行选择复选框由行号列自定义渲染接管。\n titleCheckbox: Boolean(showRowSelection) || needSeries,\n titleCustomLayout:\n option?.groupConfig?.titleCustomLayout ||\n (groupedFields\n ? createGroupTitleTagLayout({\n colors: groupTitleColors,\n columns,\n groupBy: groupedFields,\n })\n : undefined),\n titleFieldFormat:\n option?.groupConfig?.titleFieldFormat ||\n (grouped ? () => String.fromCharCode(8203) : undefined),\n }\n : option?.groupConfig,\n groupTitleFieldFormat: groupedFields\n ? groupTitleFieldFormat(groupedFields, columns)\n : option?.groupTitleFieldFormat,\n // 恒开。**行号列的复选框依赖 VTable 的级联模式**:实测把它设成 false 之后,连\n // `stateManager.select.cellPos` 都不再更新 —— 行号列的点选整个失效。\n // 原先的表达式 `Boolean(showRowSelection && (grouped || hasTree)) || option?…` 对平铺表\n // 算出来是 undefined,靠 VTable 的 `(x ?? enableTreeCheckbox) ?? true` 兜成 true 才碰巧可用;\n // 那个「只有分组/树才级联」的条件是错的,级联与是否有层级无关。显式写出来,别让下一个人\n // 以为关掉它是安全的。\n enableCheckboxCascade: option?.enableCheckboxCascade ?? true,\n enableHeaderCheckboxCascade:\n Boolean(showRowSelection && (grouped || hasTree)) ||\n Boolean(option?.enableHeaderCheckboxCascade),\n enableTreeStickCell: Boolean(grouped) || option?.enableTreeStickCell,\n enableTreeNodeMerge: grouped ? true : option?.enableTreeNodeMerge,\n hierarchyExpandLevel: grouped\n ? (option?.hierarchyExpandLevel ?? Number.POSITIVE_INFINITY)\n : hasTree\n ? (treeExpandLevel ?? option?.hierarchyExpandLevel ?? 1)\n : option?.hierarchyExpandLevel,\n hierarchyIndent: hasTree\n ? (treeIndent ?? option?.hierarchyIndent ?? 16)\n : option?.hierarchyIndent,\n hierarchyTextStartAlignment: hasTree ? true : option?.hierarchyTextStartAlignment,\n hover: hoverOption(hover) ?? option?.hover ?? { highlightMode: 'row' },\n keyboardOptions: {\n copySelected: true,\n ...(shouldEdit\n ? { editCellOnEnter: true, pasteValueToCell: true, selectAllOnCtrlA: true }\n : undefined),\n ...option?.keyboardOptions,\n },\n records: records ?? option?.records,\n rowSeriesNumber: seriesOption,\n select: {\n blankAreaClickDeselect: true,\n headerSelectMode: 'cell',\n highlightMode: 'cell',\n ...option?.select,\n // 曾经这里对分组标题行返回 true(禁选)。代价远大于收益:VTable 的拖拽分支一旦命中\n // 禁用格就直接 return,「起点 + 拖到终点」的第二次 updateSelectPos 因此被丢弃,区间\n // 塌回起点那一行;方向键跨分组行也被吞掉。而 theme 里 `groupTitleStyle.select` 本就\n // 定义了选中配色 —— 分组行是允许选中的,只是用分组填充色画出来。\n // 要禁选请走 `option={{ select: { disableSelect } }}`,注意上面的代价同样成立。\n disableSelect: option?.select?.disableSelect,\n },\n showHeader: showHeader ?? option?.showHeader ?? true,\n theme: {\n ...option?.theme,\n ...theme,\n },\n };\n};\n"],"mappings":"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"}