kokotable 0.95.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (308) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +320 -0
  3. package/contract/table-request.schema.json +424 -0
  4. package/dist/core/src/adapters/sources.d.ts +59 -0
  5. package/dist/core/src/adapters/sources.js +235 -0
  6. package/dist/core/src/client/aggregate.d.ts +94 -0
  7. package/dist/core/src/client/aggregate.js +222 -0
  8. package/dist/core/src/client/groupRows.d.ts +40 -0
  9. package/dist/core/src/client/groupRows.js +145 -0
  10. package/dist/core/src/client/runClientQuery.d.ts +67 -0
  11. package/dist/core/src/client/runClientQuery.js +157 -0
  12. package/dist/core/src/columns/ColumnBuilder.d.ts +121 -0
  13. package/dist/core/src/columns/ColumnBuilder.js +273 -0
  14. package/dist/core/src/columns/cascade.d.ts +24 -0
  15. package/dist/core/src/columns/cascade.js +93 -0
  16. package/dist/core/src/columns/deriveOperators.d.ts +38 -0
  17. package/dist/core/src/columns/deriveOperators.js +94 -0
  18. package/dist/core/src/columns/expandSorting.d.ts +19 -0
  19. package/dist/core/src/columns/expandSorting.js +52 -0
  20. package/dist/core/src/columns/helper.d.ts +196 -0
  21. package/dist/core/src/columns/helper.js +250 -0
  22. package/dist/core/src/columns/labels.d.ts +12 -0
  23. package/dist/core/src/columns/labels.js +21 -0
  24. package/dist/core/src/contract.d.ts +12 -0
  25. package/dist/core/src/contract.js +12 -0
  26. package/dist/core/src/contracts/aiColumnMeta.d.ts +102 -0
  27. package/dist/core/src/contracts/aiColumnMeta.js +197 -0
  28. package/dist/core/src/contracts/describeColumns.d.ts +48 -0
  29. package/dist/core/src/contracts/describeColumns.js +40 -0
  30. package/dist/core/src/contracts/exportData.d.ts +150 -0
  31. package/dist/core/src/contracts/exportData.js +228 -0
  32. package/dist/core/src/contracts/index.d.ts +6 -0
  33. package/dist/core/src/contracts/index.js +12 -0
  34. package/dist/core/src/contracts/legacyUrl.d.ts +47 -0
  35. package/dist/core/src/contracts/legacyUrl.js +156 -0
  36. package/dist/core/src/contracts/preset.d.ts +104 -0
  37. package/dist/core/src/contracts/preset.js +141 -0
  38. package/dist/core/src/contracts/presetStore.d.ts +81 -0
  39. package/dist/core/src/contracts/presetStore.js +146 -0
  40. package/dist/core/src/contracts/usePresets.d.ts +51 -0
  41. package/dist/core/src/contracts/usePresets.js +170 -0
  42. package/dist/core/src/defaults.d.ts +7 -0
  43. package/dist/core/src/defaults.js +9 -0
  44. package/dist/core/src/filters/codec.d.ts +20 -0
  45. package/dist/core/src/filters/codec.js +61 -0
  46. package/dist/core/src/filters/date.d.ts +30 -0
  47. package/dist/core/src/filters/date.js +179 -0
  48. package/dist/core/src/filters/describe.d.ts +45 -0
  49. package/dist/core/src/filters/describe.js +189 -0
  50. package/dist/core/src/filters/kind.d.ts +52 -0
  51. package/dist/core/src/filters/kind.js +110 -0
  52. package/dist/core/src/filters/kinds/_list.d.ts +13 -0
  53. package/dist/core/src/filters/kinds/_list.js +42 -0
  54. package/dist/core/src/filters/kinds/boolean.d.ts +3 -0
  55. package/dist/core/src/filters/kinds/boolean.js +21 -0
  56. package/dist/core/src/filters/kinds/cascade.d.ts +6 -0
  57. package/dist/core/src/filters/kinds/cascade.js +16 -0
  58. package/dist/core/src/filters/kinds/commonCode.d.ts +3 -0
  59. package/dist/core/src/filters/kinds/commonCode.js +13 -0
  60. package/dist/core/src/filters/kinds/date.d.ts +9 -0
  61. package/dist/core/src/filters/kinds/date.js +32 -0
  62. package/dist/core/src/filters/kinds/enum.d.ts +4 -0
  63. package/dist/core/src/filters/kinds/enum.js +13 -0
  64. package/dist/core/src/filters/kinds/index.d.ts +49 -0
  65. package/dist/core/src/filters/kinds/index.js +39 -0
  66. package/dist/core/src/filters/kinds/linear.d.ts +5 -0
  67. package/dist/core/src/filters/kinds/linear.js +16 -0
  68. package/dist/core/src/filters/kinds/number.d.ts +5 -0
  69. package/dist/core/src/filters/kinds/number.js +19 -0
  70. package/dist/core/src/filters/kinds/period.d.ts +4 -0
  71. package/dist/core/src/filters/kinds/period.js +17 -0
  72. package/dist/core/src/filters/kinds/relation.d.ts +5 -0
  73. package/dist/core/src/filters/kinds/relation.js +17 -0
  74. package/dist/core/src/filters/kinds/schedule.d.ts +5 -0
  75. package/dist/core/src/filters/kinds/schedule.js +16 -0
  76. package/dist/core/src/filters/kinds/text.d.ts +4 -0
  77. package/dist/core/src/filters/kinds/text.js +18 -0
  78. package/dist/core/src/filters/linear.d.ts +33 -0
  79. package/dist/core/src/filters/linear.js +65 -0
  80. package/dist/core/src/filters/list.d.ts +32 -0
  81. package/dist/core/src/filters/list.js +87 -0
  82. package/dist/core/src/filters/number.d.ts +17 -0
  83. package/dist/core/src/filters/number.js +82 -0
  84. package/dist/core/src/filters/registry.d.ts +23 -0
  85. package/dist/core/src/filters/registry.js +121 -0
  86. package/dist/core/src/filters/relation.d.ts +26 -0
  87. package/dist/core/src/filters/relation.js +75 -0
  88. package/dist/core/src/filters/schedule.d.ts +21 -0
  89. package/dist/core/src/filters/schedule.js +60 -0
  90. package/dist/core/src/filters/text.d.ts +44 -0
  91. package/dist/core/src/filters/text.js +127 -0
  92. package/dist/core/src/hooks/index.d.ts +6 -0
  93. package/dist/core/src/hooks/index.js +6 -0
  94. package/dist/core/src/hooks/useDataTable.d.ts +13 -0
  95. package/dist/core/src/hooks/useDataTable.js +109 -0
  96. package/dist/core/src/hooks/useGrouping.d.ts +33 -0
  97. package/dist/core/src/hooks/useGrouping.js +57 -0
  98. package/dist/core/src/hooks/useSearchHistory.d.ts +20 -0
  99. package/dist/core/src/hooks/useSearchHistory.js +52 -0
  100. package/dist/core/src/hooks/useTableData.d.ts +25 -0
  101. package/dist/core/src/hooks/useTableData.js +49 -0
  102. package/dist/core/src/hooks/useTableFromDefinition.d.ts +47 -0
  103. package/dist/core/src/hooks/useTableFromDefinition.js +174 -0
  104. package/dist/core/src/hooks/useTableSearch.d.ts +10 -0
  105. package/dist/core/src/hooks/useTableSearch.js +434 -0
  106. package/dist/core/src/hooks/useUrlSync.d.ts +64 -0
  107. package/dist/core/src/hooks/useUrlSync.js +145 -0
  108. package/dist/core/src/index.d.ts +38 -0
  109. package/dist/core/src/index.js +43 -0
  110. package/dist/core/src/pivot/runClientPivot.d.ts +101 -0
  111. package/dist/core/src/pivot/runClientPivot.js +230 -0
  112. package/dist/core/src/pivot/transforms.d.ts +19 -0
  113. package/dist/core/src/pivot/transforms.js +105 -0
  114. package/dist/core/src/registry.d.ts +46 -0
  115. package/dist/core/src/registry.js +67 -0
  116. package/dist/core/src/types/column.d.ts +213 -0
  117. package/dist/core/src/types/column.js +1 -0
  118. package/dist/core/src/types/data.d.ts +63 -0
  119. package/dist/core/src/types/data.js +1 -0
  120. package/dist/core/src/types/definition.d.ts +239 -0
  121. package/dist/core/src/types/definition.js +59 -0
  122. package/dist/core/src/types/filter.d.ts +94 -0
  123. package/dist/core/src/types/filter.js +1 -0
  124. package/dist/core/src/types/filterKind.d.ts +204 -0
  125. package/dist/core/src/types/filterKind.js +1 -0
  126. package/dist/core/src/types/grouping.d.ts +80 -0
  127. package/dist/core/src/types/grouping.js +4 -0
  128. package/dist/core/src/types/index.d.ts +8 -0
  129. package/dist/core/src/types/index.js +8 -0
  130. package/dist/core/src/types/operators.d.ts +64 -0
  131. package/dist/core/src/types/operators.js +108 -0
  132. package/dist/core/src/types/request.d.ts +114 -0
  133. package/dist/core/src/types/request.js +1 -0
  134. package/dist/core/src/types/search.d.ts +112 -0
  135. package/dist/core/src/types/search.js +1 -0
  136. package/dist/core/src/types/sources.d.ts +84 -0
  137. package/dist/core/src/types/sources.js +1 -0
  138. package/dist/core/src/types/table.d.ts +40 -0
  139. package/dist/core/src/types/table.js +1 -0
  140. package/dist/core/src/utils/compare.d.ts +13 -0
  141. package/dist/core/src/utils/compare.js +53 -0
  142. package/dist/core/src/utils/dateText.d.ts +12 -0
  143. package/dist/core/src/utils/dateText.js +30 -0
  144. package/dist/core/src/utils/getValue.d.ts +9 -0
  145. package/dist/core/src/utils/getValue.js +32 -0
  146. package/dist/index.d.ts +1 -0
  147. package/dist/index.js +2 -0
  148. package/dist/mui/src/TableLayout.d.ts +75 -0
  149. package/dist/mui/src/TableLayout.js +162 -0
  150. package/dist/mui/src/TableScreen.d.ts +70 -0
  151. package/dist/mui/src/TableScreen.js +174 -0
  152. package/dist/mui/src/addons/FilterModal.d.ts +45 -0
  153. package/dist/mui/src/addons/FilterModal.js +39 -0
  154. package/dist/mui/src/addons/FilterStatusModal.d.ts +40 -0
  155. package/dist/mui/src/addons/FilterStatusModal.js +68 -0
  156. package/dist/mui/src/addons/PresetBar.d.ts +56 -0
  157. package/dist/mui/src/addons/PresetBar.js +145 -0
  158. package/dist/mui/src/addons/ShareDropdown.d.ts +35 -0
  159. package/dist/mui/src/addons/ShareDropdown.js +41 -0
  160. package/dist/mui/src/addons/searchStore.d.ts +44 -0
  161. package/dist/mui/src/addons/searchStore.js +112 -0
  162. package/dist/mui/src/addons/searchSummary.d.ts +106 -0
  163. package/dist/mui/src/addons/searchSummary.js +109 -0
  164. package/dist/mui/src/columns/displayColumns.d.ts +100 -0
  165. package/dist/mui/src/columns/displayColumns.js +174 -0
  166. package/dist/mui/src/content/CardContent.d.ts +24 -0
  167. package/dist/mui/src/content/CardContent.js +25 -0
  168. package/dist/mui/src/content/ColumnMenu.d.ts +43 -0
  169. package/dist/mui/src/content/ColumnMenu.js +40 -0
  170. package/dist/mui/src/content/ColumnVisibilityMenu.d.ts +14 -0
  171. package/dist/mui/src/content/ColumnVisibilityMenu.js +37 -0
  172. package/dist/mui/src/content/EditCell.d.ts +19 -0
  173. package/dist/mui/src/content/EditCell.js +61 -0
  174. package/dist/mui/src/content/HeaderCell.d.ts +59 -0
  175. package/dist/mui/src/content/HeaderCell.js +88 -0
  176. package/dist/mui/src/content/SelectionActionBar.d.ts +17 -0
  177. package/dist/mui/src/content/SelectionActionBar.js +19 -0
  178. package/dist/mui/src/content/SortControl.d.ts +17 -0
  179. package/dist/mui/src/content/SortControl.js +45 -0
  180. package/dist/mui/src/content/TableContent.d.ts +191 -0
  181. package/dist/mui/src/content/TableContent.js +525 -0
  182. package/dist/mui/src/content/TableErrorFallback.d.ts +24 -0
  183. package/dist/mui/src/content/TableErrorFallback.js +29 -0
  184. package/dist/mui/src/content/cellError.d.ts +13 -0
  185. package/dist/mui/src/content/cellError.js +20 -0
  186. package/dist/mui/src/content/cellRenderers.d.ts +71 -0
  187. package/dist/mui/src/content/cellRenderers.js +127 -0
  188. package/dist/mui/src/content/cellValue.d.ts +27 -0
  189. package/dist/mui/src/content/cellValue.js +82 -0
  190. package/dist/mui/src/content/columnOrder.d.ts +7 -0
  191. package/dist/mui/src/content/columnOrder.js +48 -0
  192. package/dist/mui/src/content/density.d.ts +13 -0
  193. package/dist/mui/src/content/density.js +12 -0
  194. package/dist/mui/src/content/menuItems.d.ts +118 -0
  195. package/dist/mui/src/content/menuItems.js +128 -0
  196. package/dist/mui/src/content/pinning.d.ts +17 -0
  197. package/dist/mui/src/content/pinning.js +65 -0
  198. package/dist/mui/src/exporters/index.d.ts +1 -0
  199. package/dist/mui/src/exporters/index.js +1 -0
  200. package/dist/mui/src/exporters/useExportFormatters.d.ts +13 -0
  201. package/dist/mui/src/exporters/useExportFormatters.js +17 -0
  202. package/dist/mui/src/filter/FilterArea.d.ts +40 -0
  203. package/dist/mui/src/filter/FilterArea.js +37 -0
  204. package/dist/mui/src/filter/FilterInput.d.ts +14 -0
  205. package/dist/mui/src/filter/FilterInput.js +18 -0
  206. package/dist/mui/src/filter/inputs/DateFilterInput.d.ts +14 -0
  207. package/dist/mui/src/filter/inputs/DateFilterInput.js +112 -0
  208. package/dist/mui/src/filter/inputs/LinearFilterInput.d.ts +10 -0
  209. package/dist/mui/src/filter/inputs/LinearFilterInput.js +35 -0
  210. package/dist/mui/src/filter/inputs/NumberFilterInput.d.ts +12 -0
  211. package/dist/mui/src/filter/inputs/NumberFilterInput.js +111 -0
  212. package/dist/mui/src/filter/inputs/OperatorMenu.d.ts +14 -0
  213. package/dist/mui/src/filter/inputs/OperatorMenu.js +25 -0
  214. package/dist/mui/src/filter/inputs/RelationFilterInput.d.ts +11 -0
  215. package/dist/mui/src/filter/inputs/RelationFilterInput.js +67 -0
  216. package/dist/mui/src/filter/inputs/ScheduleFilterInput.d.ts +8 -0
  217. package/dist/mui/src/filter/inputs/ScheduleFilterInput.js +17 -0
  218. package/dist/mui/src/filter/inputs/SelectFilterInput.d.ts +16 -0
  219. package/dist/mui/src/filter/inputs/SelectFilterInput.js +57 -0
  220. package/dist/mui/src/filter/inputs/TextFilterInput.d.ts +13 -0
  221. package/dist/mui/src/filter/inputs/TextFilterInput.js +55 -0
  222. package/dist/mui/src/filter/kinds.d.ts +58 -0
  223. package/dist/mui/src/filter/kinds.js +103 -0
  224. package/dist/mui/src/grouping/AggregateChip.d.ts +55 -0
  225. package/dist/mui/src/grouping/AggregateChip.js +128 -0
  226. package/dist/mui/src/grouping/AggregationChips.d.ts +49 -0
  227. package/dist/mui/src/grouping/AggregationChips.js +80 -0
  228. package/dist/mui/src/grouping/AggregationSettingsButton.d.ts +14 -0
  229. package/dist/mui/src/grouping/AggregationSettingsButton.js +19 -0
  230. package/dist/mui/src/grouping/GroupingBar.d.ts +59 -0
  231. package/dist/mui/src/grouping/GroupingBar.js +267 -0
  232. package/dist/mui/src/grouping/StepExpandButton.d.ts +12 -0
  233. package/dist/mui/src/grouping/StepExpandButton.js +18 -0
  234. package/dist/mui/src/grouping/groupRow.d.ts +68 -0
  235. package/dist/mui/src/grouping/groupRow.js +129 -0
  236. package/dist/mui/src/headers/defaultHeader.d.ts +28 -0
  237. package/dist/mui/src/headers/defaultHeader.js +90 -0
  238. package/dist/mui/src/headers/defineHeader.d.ts +21 -0
  239. package/dist/mui/src/headers/defineHeader.js +68 -0
  240. package/dist/mui/src/headers/index.d.ts +5 -0
  241. package/dist/mui/src/headers/index.js +3 -0
  242. package/dist/mui/src/headers/meta.d.ts +18 -0
  243. package/dist/mui/src/headers/meta.js +11 -0
  244. package/dist/mui/src/headers/types.d.ts +84 -0
  245. package/dist/mui/src/headers/types.js +1 -0
  246. package/dist/mui/src/index.d.ts +110 -0
  247. package/dist/mui/src/index.js +79 -0
  248. package/dist/mui/src/layout/ResizeHandle.d.ts +30 -0
  249. package/dist/mui/src/layout/ResizeHandle.js +66 -0
  250. package/dist/mui/src/menus/columnMenu.d.ts +45 -0
  251. package/dist/mui/src/menus/columnMenu.js +144 -0
  252. package/dist/mui/src/menus/copy.d.ts +5 -0
  253. package/dist/mui/src/menus/copy.js +25 -0
  254. package/dist/mui/src/menus/index.d.ts +6 -0
  255. package/dist/mui/src/menus/index.js +4 -0
  256. package/dist/mui/src/menus/resolve.d.ts +15 -0
  257. package/dist/mui/src/menus/resolve.js +60 -0
  258. package/dist/mui/src/menus/rowMenu.d.ts +46 -0
  259. package/dist/mui/src/menus/rowMenu.js +76 -0
  260. package/dist/mui/src/pagination/PaginationArea.d.ts +16 -0
  261. package/dist/mui/src/pagination/PaginationArea.js +23 -0
  262. package/dist/mui/src/pivot/PivotTable.d.ts +18 -0
  263. package/dist/mui/src/pivot/PivotTable.js +100 -0
  264. package/dist/mui/src/provider/KokoTableProvider.d.ts +184 -0
  265. package/dist/mui/src/provider/KokoTableProvider.js +118 -0
  266. package/dist/mui/src/provider/labels.d.ts +85 -0
  267. package/dist/mui/src/provider/labels.js +104 -0
  268. package/dist/mui/src/registry.d.ts +30 -0
  269. package/dist/mui/src/registry.js +5 -0
  270. package/dist/mui/src/toolbar/GlobalFilterField.d.ts +36 -0
  271. package/dist/mui/src/toolbar/GlobalFilterField.js +78 -0
  272. package/dist/mui/src/virtual/VirtualTableContent.d.ts +41 -0
  273. package/dist/mui/src/virtual/VirtualTableContent.js +58 -0
  274. package/dist/mui/src/virtual/VirtualTableScreen.d.ts +13 -0
  275. package/dist/mui/src/virtual/VirtualTableScreen.js +23 -0
  276. package/dist/mui/src/virtual.d.ts +4 -0
  277. package/dist/mui/src/virtual.js +4 -0
  278. package/dist/mui/src/virtualColumns/VirtualColumnCard.d.ts +26 -0
  279. package/dist/mui/src/virtualColumns/VirtualColumnCard.js +29 -0
  280. package/dist/mui/src/virtualColumns/VirtualColumnDialog.d.ts +27 -0
  281. package/dist/mui/src/virtualColumns/VirtualColumnDialog.js +154 -0
  282. package/dist/mui/src/virtualColumns/VirtualColumnSection.d.ts +31 -0
  283. package/dist/mui/src/virtualColumns/VirtualColumnSection.js +55 -0
  284. package/dist/mui/src/virtualColumns/expression.d.ts +68 -0
  285. package/dist/mui/src/virtualColumns/expression.js +489 -0
  286. package/dist/mui/src/virtualColumns/useVirtualColumns.d.ts +67 -0
  287. package/dist/mui/src/virtualColumns/useVirtualColumns.js +111 -0
  288. package/dist/mui/src/virtualColumns/virtualColumnDefs.d.ts +29 -0
  289. package/dist/mui/src/virtualColumns/virtualColumnDefs.js +51 -0
  290. package/dist/mui-virtual.d.ts +1 -0
  291. package/dist/mui-virtual.js +2 -0
  292. package/dist/mui.d.ts +1 -0
  293. package/dist/mui.js +2 -0
  294. package/dist/query/src/index.d.ts +6 -0
  295. package/dist/query/src/index.js +7 -0
  296. package/dist/query/src/serverPivot.d.ts +42 -0
  297. package/dist/query/src/serverPivot.js +153 -0
  298. package/dist/query/src/useServerGrouping.d.ts +52 -0
  299. package/dist/query/src/useServerGrouping.js +186 -0
  300. package/dist/query/src/useServerTable.d.ts +20 -0
  301. package/dist/query/src/useServerTable.js +106 -0
  302. package/dist/query/src/useServerTableData.d.ts +48 -0
  303. package/dist/query/src/useServerTableData.js +64 -0
  304. package/dist/query/src/wire.d.ts +16 -0
  305. package/dist/query/src/wire.js +32 -0
  306. package/dist/query.d.ts +1 -0
  307. package/dist/query.js +2 -0
  308. package/package.json +125 -0
@@ -0,0 +1,129 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Box, Typography } from "@mui/material";
3
+ import { flexRender } from "@tanstack/react-table";
4
+ import { aggregations as defaultAggregations, columnMetaOf, isBuiltinAggregation } from "../../../core/src/index";
5
+ import { AggregateChip } from "./AggregateChip";
6
+ /** depth 1단계당 들여쓰기 (MUI spacing 단위). 그룹값 셀과 집계 셀에 같이 적용한다 */
7
+ export const GROUP_DEPTH_INDENT = 2;
8
+ /** depth 별 그룹 행 배경 — 깊어질수록 한 단계씩 어둡다 */
9
+ export const GROUP_ROW_BG_SHADES = ["grey.50", "grey.100", "grey.200", "grey.300"];
10
+ export function groupRowBgColor(depth) {
11
+ return GROUP_ROW_BG_SHADES[Math.min(Math.max(depth, 0), GROUP_ROW_BG_SHADES.length - 1)];
12
+ }
13
+ /** 그룹 행 hover 색 — 한 단계 더 어두운 색 */
14
+ export function groupRowHoverColor(depth) {
15
+ return groupRowBgColor(depth + 1);
16
+ }
17
+ /** 카테고리형(enum/select/text) — 고유 개수 외의 집계는 뜻이 없다 */
18
+ export function isCategoricalColumn(column) {
19
+ const dataType = columnMetaOf(column.columnDef)?.dataType;
20
+ return dataType === "enum" || dataType === "select" || dataType === "text";
21
+ }
22
+ function isBooleanColumn(column) {
23
+ return columnMetaOf(column.columnDef)?.dataType === "boolean";
24
+ }
25
+ /** 그룹 컬럼의 표시 이름 — 헤더가 문자열이면 그것, 아니면 id */
26
+ export function columnLabelOf(column) {
27
+ const header = column.columnDef.header;
28
+ return typeof header === "string" ? header : column.id;
29
+ }
30
+ /**
31
+ * 그룹값 라벨 — `node.label`(코어가 `selectOptions` 로 해석) → 컬럼 `cell` 렌더러 → 문자열.
32
+ *
33
+ * `cell` 렌더러는 TanStack 셀 컨텍스트를 기대하므로 최소한의 모조 컨텍스트로 부른다 —
34
+ * `row.original` 에는 현재 값과 조상 그룹 값을 넣어 상위 필드를 참조하는 렌더러도 동작한다.
35
+ * 렌더러가 던지면 문자열로 물러선다.
36
+ */
37
+ export function resolveGroupValue(node, column) {
38
+ const value = node.groupValue;
39
+ if (node.label !== undefined && node.label !== null && node.label !== "")
40
+ return node.label;
41
+ if (value === null || value === undefined || value === "")
42
+ return "(비어 있음)";
43
+ const cellDef = column?.columnDef.cell;
44
+ if (column && typeof cellDef === "function") {
45
+ try {
46
+ const original = Object.fromEntries(node.path.map((step) => [step.key, step.value]));
47
+ original[node.groupKey] = value;
48
+ const ctx = {
49
+ getValue: () => value,
50
+ renderValue: () => value,
51
+ row: { original, index: 0, id: `group:${node.groupKey}` },
52
+ column,
53
+ cell: undefined,
54
+ table: undefined,
55
+ };
56
+ const rendered = flexRender(cellDef, ctx);
57
+ if (rendered !== null && rendered !== undefined && rendered !== "")
58
+ return rendered;
59
+ }
60
+ catch {
61
+ // 렌더러가 행 인스턴스를 요구하는 경우 — 문자열로 물러선다
62
+ }
63
+ }
64
+ return String(value);
65
+ }
66
+ /**
67
+ * 집계 셀 내용. 그릴 것이 없으면 `null`.
68
+ *
69
+ * 우선순위: `meta.aggRender` → 카테고리형은 `count_distinct` + 사용자 집계(`applies` 참)만, boolean 은 `applies("boolean")` 인 것만
70
+ * (내장: `count_true`·`count_distinct`·`ratio`) → `AggregateChip`
71
+ * (선택된 함수 = `selection[columnId]`, 없으면 첫 값. 함수가 둘 이상이면 칩을 눌러 바꾼다).
72
+ * 대상은 `meta.enableAgg` / `meta.aggRender` 가 있거나 `node.aggregates[columnId]` 가 있는 컬럼뿐이다.
73
+ */
74
+ export function renderAggregateCellContent({ column, node, selection, onSelect, chip, registry: givenRegistry, }) {
75
+ const Chip = chip ?? AggregateChip;
76
+ const registry = givenRegistry ?? defaultAggregations;
77
+ const meta = columnMetaOf(column.columnDef);
78
+ const allAggregates = node.aggregates ?? {};
79
+ let perColumn = allAggregates[column.id];
80
+ if (!meta?.enableAgg && !meta?.aggRender && !perColumn)
81
+ return null;
82
+ const presentFns = (source) => source ? Object.keys(source).filter((fn) => source[fn] !== null && source[fn] !== undefined) : [];
83
+ if (meta?.aggRender) {
84
+ const fns = presentFns(perColumn);
85
+ const value = fns.length > 0 ? perColumn[fns[0]] : undefined;
86
+ const render = meta.aggRender;
87
+ const rendered = render({ value, columnId: column.id, allAggregates }, column);
88
+ return rendered === null || rendered === undefined ? null : rendered;
89
+ }
90
+ if (!perColumn)
91
+ return null;
92
+ const dataType = meta?.dataType;
93
+ const keep = (fn) => {
94
+ if (isCategoricalColumn(column)) {
95
+ // 내장은 고유 개수만 (최빈값 등은 그룹 행에 길게 찍히므로 뺀다); 사용자 집계는 `applies` 를 따른다
96
+ if (fn === "count_distinct")
97
+ return true;
98
+ if (isBuiltinAggregation(fn))
99
+ return false;
100
+ return !!registry.get(fn)?.applies(dataType);
101
+ }
102
+ if (isBooleanColumn(column))
103
+ return !!registry.get(fn)?.applies(dataType);
104
+ return true;
105
+ };
106
+ if (isCategoricalColumn(column) || isBooleanColumn(column)) {
107
+ const kept = {};
108
+ for (const fn of Object.keys(perColumn))
109
+ if (keep(fn) && perColumn[fn] !== undefined)
110
+ kept[fn] = perColumn[fn];
111
+ perColumn = kept;
112
+ }
113
+ const available = presentFns(perColumn);
114
+ if (available.length === 0)
115
+ return null;
116
+ const chosen = selection[column.id];
117
+ const selected = chosen && available.includes(chosen) ? chosen : available[0];
118
+ const toggleable = available.length > 1 && !!onSelect;
119
+ const value = perColumn[selected];
120
+ return (_jsx(Chip, { aggFn: selected, value: typeof value === "number" || typeof value === "string" ? value : String(value), options: available, columnLabel: columnLabelOf(column), registry: givenRegistry, onChangeAggFn: toggleable ? (fn) => onSelect(column.id, fn) : undefined }));
121
+ }
122
+ /** 그룹값 텍스트 — 굵게 */
123
+ export function GroupValueText({ children }) {
124
+ return (_jsx(Typography, { component: "span", variant: "body2", sx: { fontWeight: 600, whiteSpace: "nowrap" }, children: children }));
125
+ }
126
+ /** 집계 셀 내용을 가운데 놓는다 (ERP `aggCellContentSx`) */
127
+ export function AggregateCellBox({ children }) {
128
+ return (_jsx(Box, { sx: { display: "flex", justifyContent: "center", alignItems: "center", width: "100%", minWidth: 0 }, children: children }));
129
+ }
@@ -0,0 +1,28 @@
1
+ import type { ReactNode } from "react";
2
+ import type { RowData } from "@tanstack/react-table";
3
+ import type { HeaderDef, HeaderRenderContext, HeaderSlots } from "./types";
4
+ /** 정렬 화살표 — MUI `TableSortLabel` 과 같은 모양(asc = 위). 정렬 전에는 흐리게, 다중 정렬은 순번 */
5
+ export declare function SortArrow({ ctx }: {
6
+ ctx: HeaderRenderContext<any>;
7
+ }): import("react").JSX.Element;
8
+ /**
9
+ * 기본 슬롯 — 지금까지 `HeaderCell` 이 직접 그리던 것을 다섯 자리로 나눈 것.
10
+ * 소비자 정의는 `slots: { sortIndicator: … }` 처럼 일부만 바꾼다.
11
+ */
12
+ export declare const defaultHeaderSlots: HeaderSlots<any>;
13
+ /**
14
+ * 기본 배치 — `[pin] [content sortIndicator] [menuTrigger]` + 오른쪽 가장자리 `resizeHandle`.
15
+ * 정렬 가능하면 내용+화살표가 버튼이 된다 (클릭: 정렬 · Shift+클릭: 정렬 추가 · Enter/Space).
16
+ */
17
+ export declare function renderDefaultHeader<T extends RowData>(ctx: HeaderRenderContext<T>, slots: HeaderSlots<T>): ReactNode;
18
+ /** 기본 헤더 — 다른 정의와 같은 API 로 만든다 (dogfooding) */
19
+ export declare const defaultHeader: HeaderDef<any>;
20
+ /** 촘촘한 헤더 — 메뉴 버튼·리사이즈 핸들 없이 내용과 정렬 화살표만. 우클릭 메뉴는 그대로 열린다 */
21
+ export declare const compactHeader: HeaderDef<any>;
22
+ /** 내장 헤더 정의 — `meta.header: "compact"` 처럼 id 로 고른다 */
23
+ export declare const headerRegistry: import("..").Registry<HeaderDef<any>>;
24
+ /** 정의 하나를 실제 그릴 수 있게 기본과 합친다 — `render` 없으면 기본 배치가 슬롯을 조합한다 */
25
+ export declare function materializeHeader<T extends RowData>(def: HeaderDef<T>): {
26
+ render: NonNullable<HeaderDef<T>["render"]>;
27
+ slots: HeaderSlots<T>;
28
+ };
@@ -0,0 +1,90 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Box, IconButton, Stack, Tooltip } from "@mui/material";
3
+ import ArrowDownwardIcon from "@mui/icons-material/ArrowDownward";
4
+ import MoreVertIcon from "@mui/icons-material/MoreVert";
5
+ import PushPinIcon from "@mui/icons-material/PushPin";
6
+ import { createRegistry } from "../registry";
7
+ import { defineHeader } from "./defineHeader";
8
+ import { headerRuleMetaOf } from "./meta";
9
+ const JUSTIFY = {
10
+ left: "flex-start", center: "center", right: "flex-end",
11
+ };
12
+ /** 정렬 화살표 — MUI `TableSortLabel` 과 같은 모양(asc = 위). 정렬 전에는 흐리게, 다중 정렬은 순번 */
13
+ export function SortArrow({ ctx }) {
14
+ const { sortState, multiSortIndex } = ctx;
15
+ return (_jsxs(Box, { component: "span", className: "koko-sort-indicator", "aria-hidden": true, sx: {
16
+ display: "inline-flex", alignItems: "center", ml: 0.5,
17
+ opacity: sortState ? 1 : 0.3, transition: "opacity 120ms",
18
+ ".koko-header-sort:hover &": { opacity: sortState ? 1 : 0.7 },
19
+ }, children: [_jsx(ArrowDownwardIcon, { sx: {
20
+ fontSize: 16,
21
+ transition: "transform 200ms",
22
+ transform: sortState?.desc ? "rotate(0deg)" : "rotate(180deg)",
23
+ } }), multiSortIndex !== null && (_jsx(Box, { component: "span", sx: { fontSize: 10, color: "text.disabled" }, children: multiSortIndex }))] }));
24
+ }
25
+ /**
26
+ * 기본 슬롯 — 지금까지 `HeaderCell` 이 직접 그리던 것을 다섯 자리로 나눈 것.
27
+ * 소비자 정의는 `slots: { sortIndicator: … }` 처럼 일부만 바꾼다.
28
+ */
29
+ export const defaultHeaderSlots = {
30
+ content: (ctx) => {
31
+ const tooltip = headerRuleMetaOf(ctx.column.columnDef).headerTooltip;
32
+ const label = ctx.defaultContent;
33
+ if (!tooltip || ctx.header.isPlaceholder)
34
+ return label;
35
+ return (_jsx(Tooltip, { title: tooltip, enterDelay: 300, children: _jsx(Box, { component: "span", sx: { textDecoration: "underline dotted", textUnderlineOffset: 3 }, children: label }) }));
36
+ },
37
+ sortIndicator: (ctx) => (ctx.can.canSort && ctx.sort ? _jsx(SortArrow, { ctx: ctx }) : null),
38
+ pinIndicator: (ctx) => (ctx.column.getIsPinned() ? (_jsx(PushPinIcon, { className: "koko-pin-indicator", "aria-label": ctx.labels.ui.unpin, sx: { fontSize: 12, color: "text.disabled", mr: 0.5, transform: ctx.column.getIsPinned() === "right" ? "scaleX(-1)" : undefined } })) : null),
39
+ menuTrigger: (ctx) => (ctx.menuEnabled ? (_jsx(IconButton, { size: "small", "aria-label": `${ctx.column.id} ${ctx.labels.ui.columnMenu}`, "aria-haspopup": "menu", className: "koko-column-menu-button", onClick: (event) => { event.stopPropagation(); ctx.openMenu(event.currentTarget); }, sx: { p: 0.25, ml: 0.25, opacity: 0.35, "&:hover": { opacity: 1 } }, children: _jsx(MoreVertIcon, { sx: { fontSize: 16 } }) })) : null),
40
+ resizeHandle: (ctx) => {
41
+ const { column, header } = ctx;
42
+ if (!ctx.can.canResize)
43
+ return null;
44
+ return (_jsx(Box, { role: "separator", "aria-orientation": "vertical", "aria-label": ctx.labels.ui.resizeHandle(column.id), onMouseDown: header.getResizeHandler(), onTouchStart: header.getResizeHandler(), onClick: (event) => event.stopPropagation(), onDoubleClick: () => column.resetSize(), sx: {
45
+ position: "absolute", top: 0, right: 0, bottom: 0, width: 6,
46
+ cursor: "col-resize", userSelect: "none", touchAction: "none",
47
+ "&:hover, &:active": { backgroundColor: "primary.main", opacity: 0.5 },
48
+ ...(column.getIsResizing() ? { backgroundColor: "primary.main", opacity: 0.8 } : {}),
49
+ } }));
50
+ },
51
+ };
52
+ /**
53
+ * 기본 배치 — `[pin] [content sortIndicator] [menuTrigger]` + 오른쪽 가장자리 `resizeHandle`.
54
+ * 정렬 가능하면 내용+화살표가 버튼이 된다 (클릭: 정렬 · Shift+클릭: 정렬 추가 · Enter/Space).
55
+ */
56
+ export function renderDefaultHeader(ctx, slots) {
57
+ const { sort, column, align } = ctx;
58
+ const sortable = ctx.can.canSort && !!sort;
59
+ const body = _jsxs(_Fragment, { children: [slots.content(ctx), slots.sortIndicator(ctx)] });
60
+ const onKeyDown = (event) => {
61
+ if (event.key === "Enter" || event.key === " ") {
62
+ event.preventDefault();
63
+ sort?.toggleSort(column.id, { multi: event.shiftKey });
64
+ }
65
+ };
66
+ return (_jsxs(_Fragment, { children: [_jsxs(Stack, { direction: "row", alignItems: "center", justifyContent: align ? JUSTIFY[align] : "flex-start", sx: { minWidth: 0 }, children: [slots.pinIndicator(ctx), sortable ? (_jsx(Tooltip, { title: ctx.labels.ui.sortHint, enterDelay: 600, children: _jsx(Box, { component: "span", role: "button", tabIndex: 0, className: "koko-header-sort", onClick: (event) => sort.toggleSort(column.id, { multi: event.shiftKey }), onKeyDown: onKeyDown, sx: {
67
+ display: "inline-flex", alignItems: "center", minWidth: 0, cursor: "pointer", userSelect: "none",
68
+ overflow: "hidden", textOverflow: "ellipsis",
69
+ "&:hover": { color: "text.secondary" },
70
+ "&:focus-visible": { outline: "2px solid", outlineColor: "primary.main", outlineOffset: 2, borderRadius: 0.5 },
71
+ }, children: body }) })) : (_jsx(Box, { component: "span", sx: { display: "inline-flex", alignItems: "center", minWidth: 0, overflow: "hidden", textOverflow: "ellipsis" }, children: body })), slots.menuTrigger(ctx)] }), slots.resizeHandle(ctx)] }));
72
+ }
73
+ /** 기본 헤더 — 다른 정의와 같은 API 로 만든다 (dogfooding) */
74
+ export const defaultHeader = defineHeader({
75
+ id: "default",
76
+ slots: defaultHeaderSlots,
77
+ render: renderDefaultHeader,
78
+ });
79
+ /** 촘촘한 헤더 — 메뉴 버튼·리사이즈 핸들 없이 내용과 정렬 화살표만. 우클릭 메뉴는 그대로 열린다 */
80
+ export const compactHeader = defineHeader({
81
+ id: "compact",
82
+ slots: { menuTrigger: () => null, resizeHandle: () => null, pinIndicator: () => null },
83
+ });
84
+ /** 내장 헤더 정의 — `meta.header: "compact"` 처럼 id 로 고른다 */
85
+ export const headerRegistry = createRegistry([defaultHeader, compactHeader]);
86
+ /** 정의 하나를 실제 그릴 수 있게 기본과 합친다 — `render` 없으면 기본 배치가 슬롯을 조합한다 */
87
+ export function materializeHeader(def) {
88
+ const slots = { ...defaultHeaderSlots, ...def.slots };
89
+ return { render: def.render ?? renderDefaultHeader, slots };
90
+ }
@@ -0,0 +1,21 @@
1
+ import type { RowData } from "@tanstack/react-table";
2
+ import type { Registry } from "../registry";
3
+ import type { HeaderCapabilities, HeaderContext, HeaderDef, HeaderMeta } from "./types";
4
+ /** 헤더 정의 — 타입을 좁혀 주는 항등 함수 (설계 2절). Provider `headers[]` 나 `meta.header` 에 넣는다 */
5
+ export declare function defineHeader<T extends RowData = any>(def: HeaderDef<T>): HeaderDef<T>;
6
+ export declare function headerMetaOf<T extends RowData = any>(columnDef: {
7
+ meta?: unknown;
8
+ } | undefined): HeaderMeta<T>;
9
+ /**
10
+ * 적용 순서: `column.meta.header`(id 또는 정의) > Provider `headers[]` 중 `when` 이 참인 첫 정의 > 내장 기본.
11
+ * 문자열 id 는 Provider 정의 → 내장 레지스트리 순으로 찾고, 없으면 기본이다.
12
+ */
13
+ export declare function resolveHeaderDef<T extends RowData>(ctx: HeaderContext<T>, providerHeaders: ReadonlyArray<HeaderDef<T>>, builtin: Registry<HeaderDef<any>>, fallback: HeaderDef<any>): HeaderDef<T>;
14
+ /**
15
+ * 규칙을 해석하고 그 결과를 TanStack 컬럼 정의에 되쓴다.
16
+ *
17
+ * `column.columnDef` 는 테이블 인스턴스가 만든 사본이라 소비자의 정의 객체는 바뀌지 않는다.
18
+ * 되쓰는 이유: `ColumnVisibilityMenu` 처럼 `column.getCanHide()` 만 보는 곳도 같은 답을 내야 한다.
19
+ * 규칙이 없는 항목은 건드리지 않는다. 멱등이라 렌더 중에 불러도 안전하다.
20
+ */
21
+ export declare function applyHeaderRules<T extends RowData>(ctx: HeaderContext<T>, def: HeaderDef<T> | undefined): HeaderCapabilities;
@@ -0,0 +1,68 @@
1
+ /** 헤더 정의 — 타입을 좁혀 주는 항등 함수 (설계 2절). Provider `headers[]` 나 `meta.header` 에 넣는다 */
2
+ export function defineHeader(def) {
3
+ return def;
4
+ }
5
+ export function headerMetaOf(columnDef) {
6
+ return columnDef?.meta ?? {};
7
+ }
8
+ /**
9
+ * 적용 순서: `column.meta.header`(id 또는 정의) > Provider `headers[]` 중 `when` 이 참인 첫 정의 > 내장 기본.
10
+ * 문자열 id 는 Provider 정의 → 내장 레지스트리 순으로 찾고, 없으면 기본이다.
11
+ */
12
+ export function resolveHeaderDef(ctx, providerHeaders, builtin, fallback) {
13
+ const meta = headerMetaOf(ctx.column.columnDef).header;
14
+ if (meta && typeof meta === "object")
15
+ return meta;
16
+ if (typeof meta === "string") {
17
+ return providerHeaders.find((def) => def.id === meta) ?? builtin.get(meta) ?? fallback;
18
+ }
19
+ return providerHeaders.find((def) => !def.when || def.when(ctx)) ?? fallback;
20
+ }
21
+ const RULE_TO_OPTION = {
22
+ canSort: "enableSorting",
23
+ canPin: "enablePinning",
24
+ canHide: "enableHiding",
25
+ canResize: "enableResizing",
26
+ canGroup: "enableGrouping",
27
+ canFilter: "enableColumnFilter",
28
+ };
29
+ function fallbackOf(column, table, key) {
30
+ const def = column.columnDef;
31
+ switch (key) {
32
+ case "canSort": return column.getCanSort();
33
+ case "canPin": return column.getCanPin();
34
+ case "canHide": return column.getCanHide();
35
+ // 테이블에서 리사이즈를 켜지 않았으면 핸들도 항목도 의미가 없다
36
+ case "canResize": return !!table.options.enableColumnResizing && column.getCanResize();
37
+ // 그룹핑은 TanStack 이 아니라 `useGrouping` 이 맡는다 — 컬럼 정의의 플래그만 본다
38
+ case "canGroup": return def.enableGrouping !== false;
39
+ case "canFilter": return def.enableColumnFilter !== false && !!def.filter && !def.filter.hidden;
40
+ }
41
+ }
42
+ /**
43
+ * 규칙을 해석하고 그 결과를 TanStack 컬럼 정의에 되쓴다.
44
+ *
45
+ * `column.columnDef` 는 테이블 인스턴스가 만든 사본이라 소비자의 정의 객체는 바뀌지 않는다.
46
+ * 되쓰는 이유: `ColumnVisibilityMenu` 처럼 `column.getCanHide()` 만 보는 곳도 같은 답을 내야 한다.
47
+ * 규칙이 없는 항목은 건드리지 않는다. 멱등이라 렌더 중에 불러도 안전하다.
48
+ */
49
+ export function applyHeaderRules(ctx, def) {
50
+ const rules = def?.rules ?? {};
51
+ const out = {};
52
+ const target = ctx.column.columnDef;
53
+ for (const key of Object.keys(RULE_TO_OPTION)) {
54
+ const rule = rules[key];
55
+ if (rule) {
56
+ const allowed = !!rule(ctx);
57
+ const option = RULE_TO_OPTION[key];
58
+ if (target[option] !== allowed)
59
+ target[option] = allowed;
60
+ // TanStack 은 accessor 없는 컬럼은 규칙이 허용해도 정렬·필터할 수 없다
61
+ out[key] = key === "canGroup" || key === "canFilter" ? allowed : allowed && fallbackOf(ctx.column, ctx.table, key);
62
+ }
63
+ else {
64
+ out[key] = fallbackOf(ctx.column, ctx.table, key);
65
+ }
66
+ }
67
+ return out;
68
+ }
@@ -0,0 +1,5 @@
1
+ export { defineHeader, resolveHeaderDef, applyHeaderRules, headerMetaOf } from "./defineHeader";
2
+ export { defaultHeader, compactHeader, headerRegistry, defaultHeaderSlots, renderDefaultHeader, materializeHeader, SortArrow, } from "./defaultHeader";
3
+ export { headerRuleMetaOf, resolveCellAlign } from "./meta";
4
+ export type { HeaderRuleMeta, CellAlign } from "./meta";
5
+ export type { HeaderContext, HeaderRenderContext, HeaderCapabilities, HeaderSlots, HeaderSlot, HeaderRules, HeaderDef, HeaderMeta, HeaderAlign, } from "./types";
@@ -0,0 +1,3 @@
1
+ export { defineHeader, resolveHeaderDef, applyHeaderRules, headerMetaOf } from "./defineHeader";
2
+ export { defaultHeader, compactHeader, headerRegistry, defaultHeaderSlots, renderDefaultHeader, materializeHeader, SortArrow, } from "./defaultHeader";
3
+ export { headerRuleMetaOf, resolveCellAlign } from "./meta";
@@ -0,0 +1,18 @@
1
+ export type CellAlign = "left" | "center" | "right";
2
+ /**
3
+ * 코어 `ColumnMeta` 의 헤더·셀 규칙 — 코어에 있는 필드지만 mui 가 캐스팅으로 읽는다
4
+ * (코어 `ColumnMeta` 가 제네릭이라 `columnDef.meta` 를 그대로 좁히기 번거롭다).
5
+ */
6
+ export interface HeaderRuleMeta {
7
+ headerTooltip?: string;
8
+ headerAlign?: CellAlign;
9
+ /** 셀 정렬. 미지정 시 숫자(`dataType: "number"`)는 right */
10
+ align?: CellAlign;
11
+ }
12
+ export declare function headerRuleMetaOf(columnDef: {
13
+ meta?: unknown;
14
+ } | undefined): HeaderRuleMeta;
15
+ /** 셀 정렬 — `meta.align` → 숫자는 right → 미지정 */
16
+ export declare function resolveCellAlign(columnDef: {
17
+ meta?: unknown;
18
+ } | undefined): CellAlign | undefined;
@@ -0,0 +1,11 @@
1
+ import { columnMetaOf } from "../../../core/src/index";
2
+ export function headerRuleMetaOf(columnDef) {
3
+ return columnDef?.meta ?? {};
4
+ }
5
+ /** 셀 정렬 — `meta.align` → 숫자는 right → 미지정 */
6
+ export function resolveCellAlign(columnDef) {
7
+ const rule = headerRuleMetaOf(columnDef);
8
+ if (rule.align)
9
+ return rule.align;
10
+ return columnMetaOf(columnDef)?.dataType === "number" ? "right" : undefined;
11
+ }
@@ -0,0 +1,84 @@
1
+ import type { ReactNode } from "react";
2
+ import type { PopoverPosition } from "@mui/material";
3
+ import type { Column, Header, RowData, Table } from "@tanstack/react-table";
4
+ import type { ColumnSortState, SortSource } from "../../../core/src/index";
5
+ import type { KokoTableLabels } from "../provider/labels";
6
+ export type HeaderAlign = "left" | "center" | "right";
7
+ /**
8
+ * 헤더 정의·규칙·메뉴 항목이 받는 컨텍스트 (설계 문서 2절).
9
+ * 설계의 다섯 필드(`header · column · table · sort · labels`)에 정렬 상태 둘을 더했다 —
10
+ * 슬롯·메뉴 항목이 `sort.getColumnSort()` 를 각자 다시 부르지 않게.
11
+ */
12
+ export interface HeaderContext<T extends RowData = any> {
13
+ header: Header<T, unknown>;
14
+ column: Column<T, unknown>;
15
+ table: Table<T>;
16
+ sort: SortSource | undefined;
17
+ labels: KokoTableLabels;
18
+ /** 이 컬럼의 정렬 상태. 정렬 중이 아니거나 `sort` 가 없으면 null */
19
+ sortState: ColumnSortState | null;
20
+ /** 다중 정렬일 때 1부터 시작하는 순번. 단일 정렬이면 null */
21
+ multiSortIndex: number | null;
22
+ }
23
+ /** `rules` 와 TanStack 옵션을 합친 결과 — 슬롯·메뉴 항목 `when` 이 본다 */
24
+ export interface HeaderCapabilities {
25
+ canSort: boolean;
26
+ canPin: boolean;
27
+ canHide: boolean;
28
+ canGroup: boolean;
29
+ canResize: boolean;
30
+ canFilter: boolean;
31
+ }
32
+ /** 슬롯·`render` 가 받는 컨텍스트 — 규칙 해석 결과와 기본 내용·메뉴 열기가 더해진다 */
33
+ export interface HeaderRenderContext<T extends RowData = any> extends HeaderContext<T> {
34
+ can: HeaderCapabilities;
35
+ /** `columnDef.header` 렌더 결과 (`TableContent renderHeader` prop 적용 후). placeholder 헤더면 null */
36
+ defaultContent: ReactNode;
37
+ /** 헤더 정렬 (`meta.headerAlign` → 셀 정렬 → 표시 전용은 center) */
38
+ align: HeaderAlign | undefined;
39
+ /** 컬럼 메뉴를 쓸 수 있는가 (테이블 있음 · `enableColumnMenu` · 표시 전용/placeholder 아님) */
40
+ menuEnabled: boolean;
41
+ /** 컬럼 메뉴 열기 — 앵커 요소(버튼) 또는 커서 좌표. `menuEnabled` 가 아니면 아무 일도 없다 */
42
+ openMenu: (anchor: HTMLElement | PopoverPosition) => void;
43
+ size?: "small" | "medium";
44
+ }
45
+ export type HeaderSlot<T extends RowData = any> = (ctx: HeaderRenderContext<T>) => ReactNode;
46
+ /** 헤더 셀을 이루는 다섯 자리 — 각각 `(ctx) => ReactNode` */
47
+ export interface HeaderSlots<T extends RowData = any> {
48
+ content: HeaderSlot<T>;
49
+ sortIndicator: HeaderSlot<T>;
50
+ resizeHandle: HeaderSlot<T>;
51
+ menuTrigger: HeaderSlot<T>;
52
+ pinIndicator: HeaderSlot<T>;
53
+ }
54
+ /**
55
+ * 소비자가 정하는 규칙. 정의한 규칙이 TanStack 옵션(`enableSorting` 등)보다 우선하고,
56
+ * 그 결과가 컬럼 정의(`column.columnDef.enable*`)에도 써져 `column.getCanSort()` 류가 같은 답을 낸다.
57
+ * 정의하지 않은 규칙은 TanStack 옵션을 따른다.
58
+ */
59
+ export interface HeaderRules<T extends RowData = any> {
60
+ canSort?: (ctx: HeaderContext<T>) => boolean;
61
+ canPin?: (ctx: HeaderContext<T>) => boolean;
62
+ canHide?: (ctx: HeaderContext<T>) => boolean;
63
+ canGroup?: (ctx: HeaderContext<T>) => boolean;
64
+ canResize?: (ctx: HeaderContext<T>) => boolean;
65
+ canFilter?: (ctx: HeaderContext<T>) => boolean;
66
+ }
67
+ export interface HeaderDef<T extends RowData = any> {
68
+ id: string;
69
+ /**
70
+ * 헤더 셀 내용 전체 교체. 미지정 시 기본 배치(`renderDefaultHeader`)가 `slots` 를 조합한다.
71
+ * 바깥 `<th>`(colSpan · 고정 sticky · 폭 · 우클릭 메뉴)는 유지된다 — `<th>` 까지 바꾸려면 `components.HeaderCell`.
72
+ */
73
+ render?: (ctx: HeaderRenderContext<T>, slots: HeaderSlots<T>) => ReactNode;
74
+ /** 일부 자리만 교체 — 나머지는 기본 슬롯 */
75
+ slots?: Partial<HeaderSlots<T>>;
76
+ rules?: HeaderRules<T>;
77
+ /** 이 정의를 어느 컬럼에 적용할지 (Provider `headers[]` 에서 첫 참 정의가 이긴다). 미지정 = 모든 컬럼 */
78
+ when?: (ctx: HeaderContext<T>) => boolean;
79
+ }
80
+ /** 코어 `ColumnMeta` 에 없는 헤더 정의 자리 — `columnMetaOf` 캐스팅으로 읽는다 (코어 추가 요청) */
81
+ export interface HeaderMeta<T extends RowData = any> {
82
+ /** 헤더 정의 id(Provider `headers[]` 또는 내장 `default`·`compact`) 또는 정의 객체 */
83
+ header?: string | HeaderDef<T>;
84
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,110 @@
1
+ export { FilterArea, resolveFilterGridSize } from "./filter/FilterArea";
2
+ export type { FilterAreaProps, GridColCount, GridColsConfig } from "./filter/FilterArea";
3
+ export { FilterInput } from "./filter/FilterInput";
4
+ export { OperatorMenu, operatorLabel, OPERATOR_LABELS } from "./filter/inputs/OperatorMenu";
5
+ export { TextFilterInput } from "./filter/inputs/TextFilterInput";
6
+ export { NumberFilterInput } from "./filter/inputs/NumberFilterInput";
7
+ export { DateFilterInput, periodRange } from "./filter/inputs/DateFilterInput";
8
+ export { SelectFilterInput, MultiSelectFilterInput, BooleanFilterInput, } from "./filter/inputs/SelectFilterInput";
9
+ export { RelationFilterInput } from "./filter/inputs/RelationFilterInput";
10
+ export { LinearFilterInput } from "./filter/inputs/LinearFilterInput";
11
+ export { ScheduleFilterInput } from "./filter/inputs/ScheduleFilterInput";
12
+ export { withEditor, builtinFilterEditors, defaultEditorForVariant, registerBuiltinEditors, resolveFilterEditor, resolveFilterChip, } from "./filter/kinds";
13
+ export type { FilterKindDisplay, LooseFilterKindDisplay, ProvidedFilterKinds, ResolveFilterEditorConfig } from "./filter/kinds";
14
+ export { TableContent } from "./content/TableContent";
15
+ export type { TableContentProps, RowProps, DetailPanelProps, EditingOptions, EditMode, VirtualRows, VirtualColumns, } from "./content/TableContent";
16
+ export { HeaderCell } from "./content/HeaderCell";
17
+ export type { HeaderCellProps } from "./content/HeaderCell";
18
+ export { ColumnMenu, moveColumn, canMoveColumn } from "./content/ColumnMenu";
19
+ export type { ColumnMenuProps } from "./content/ColumnMenu";
20
+ export { ColumnVisibilityMenu } from "./content/ColumnVisibilityMenu";
21
+ export type { ColumnVisibilityMenuProps } from "./content/ColumnVisibilityMenu";
22
+ export { SelectionActionBar } from "./content/SelectionActionBar";
23
+ export type { SelectionActionBarProps } from "./content/SelectionActionBar";
24
+ export { TableErrorFallback, errorStatus, isBadRequestError } from "./content/TableErrorFallback";
25
+ export type { TableErrorFallbackProps } from "./content/TableErrorFallback";
26
+ export { EditCell } from "./content/EditCell";
27
+ export type { EditCellProps, EditSpecMeta } from "./content/EditCell";
28
+ export { renderCellValue } from "./content/cellValue";
29
+ export type { CellValueOptions } from "./content/cellValue";
30
+ export { getCellError, cellErrorSx } from "./content/cellError";
31
+ export type { CellErrorInfo } from "./content/cellError";
32
+ export { pinnedSx } from "./content/pinning";
33
+ export { resolveDensity } from "./content/density";
34
+ export type { Density, DensitySpec } from "./content/density";
35
+ export { selectionColumn, expandColumn, rowActionsColumn, rowNumberColumn, withDisplayColumns, canExpandRow, isDisplayColumnId, DISPLAY_COLUMN_PREFIX, LEGACY_DISPLAY_COLUMN_PREFIX, LEGACY_DISPLAY_COLUMN_IDS, ROW_SELECT_COLUMN_ID, ROW_EXPAND_COLUMN_ID, ROW_ACTIONS_COLUMN_ID, ROW_NUMBER_COLUMN_ID, } from "./columns/displayColumns";
36
+ export type { SelectionColumnOptions, ExpandColumnOptions, RowActionsColumnOptions, RowNumberColumnOptions, WithDisplayColumnsOptions, } from "./columns/displayColumns";
37
+ export { GlobalFilterField } from "./toolbar/GlobalFilterField";
38
+ export type { GlobalFilterFieldProps } from "./toolbar/GlobalFilterField";
39
+ export { SortControl } from "./content/SortControl";
40
+ export type { SortControlProps } from "./content/SortControl";
41
+ export { CardContent } from "./content/CardContent";
42
+ export type { CardContentProps } from "./content/CardContent";
43
+ export { GroupingBar } from "./grouping/GroupingBar";
44
+ export type { GroupingBarProps } from "./grouping/GroupingBar";
45
+ export { StepExpandButton } from "./grouping/StepExpandButton";
46
+ export type { StepExpandButtonProps } from "./grouping/StepExpandButton";
47
+ export { GROUP_DRAG_COLUMN_TYPE, GROUP_DRAG_INDEX_TYPE, GROUP_BATCH_SIZE_OPTIONS, GROUP_REJECTED_MESSAGE, } from "./grouping/GroupingBar";
48
+ export { AggregationChips, aggregatableColumns, toggleAggregation } from "./grouping/AggregationChips";
49
+ export type { AggregationChipsProps } from "./grouping/AggregationChips";
50
+ export { AggregateChip, getAggIcon, formatAggValue, AGG_CHIP_COLORS } from "./grouping/AggregateChip";
51
+ export type { AggregateChipProps, AggChipColor } from "./grouping/AggregateChip";
52
+ export { GROUP_DEPTH_INDENT, GROUP_ROW_BG_SHADES, groupRowBgColor, resolveGroupValue, renderAggregateCellContent, isCategoricalColumn, } from "./grouping/groupRow";
53
+ export type { AggRender, AggRenderProps, AggregateCellContentOptions } from "./grouping/groupRow";
54
+ export type { GroupRowLayout } from "./content/TableContent";
55
+ export { PaginationArea } from "./pagination/PaginationArea";
56
+ export type { PaginationAreaProps } from "./pagination/PaginationArea";
57
+ export { PivotTable } from "./pivot/PivotTable";
58
+ export type { PivotTableProps } from "./pivot/PivotTable";
59
+ export { TopFilterLayout, SideFilterLayout, SearchBar } from "./TableLayout";
60
+ export type { TableLayoutProps, TopFilterLayoutProps, SideFilterLayoutProps, SearchBarProps, CollapsibleFilterProps, } from "./TableLayout";
61
+ export { ResizeHandle, useResizeWidth, clampWidth } from "./layout/ResizeHandle";
62
+ export type { ResizeHandleProps, ResizeHandleBinding, UseResizeWidthOptions } from "./layout/ResizeHandle";
63
+ export { useVirtualColumns, virtualColumnSlots } from "./virtualColumns/useVirtualColumns";
64
+ export type { VirtualColumn, VirtualColumnInput, VirtualColumnResult, UseVirtualColumnsOptions, UseVirtualColumnsReturn, } from "./virtualColumns/useVirtualColumns";
65
+ export { virtualColumnDefs, virtualColumnFields } from "./virtualColumns/virtualColumnDefs";
66
+ export type { VirtualColumnDefsOptions } from "./virtualColumns/virtualColumnDefs";
67
+ export { validateExpression, evaluateExpression, evaluateTemplate, evaluateVirtualColumn, applyVirtualColumns, tokenizeExpression, normalizeExpression, referencedFields, describeExpression, TEMPLATE_FIELD_PATTERN, } from "./virtualColumns/expression";
68
+ export type { VirtualColumnType, VirtualColumnField, ExpressionValidation, Token as ExpressionToken, } from "./virtualColumns/expression";
69
+ export { VirtualColumnSection } from "./virtualColumns/VirtualColumnSection";
70
+ export type { VirtualColumnSectionProps } from "./virtualColumns/VirtualColumnSection";
71
+ export { VirtualColumnDialog } from "./virtualColumns/VirtualColumnDialog";
72
+ export type { VirtualColumnDialogProps } from "./virtualColumns/VirtualColumnDialog";
73
+ export { VirtualColumnCard, VIRTUAL_NUMBER_OPERATORS } from "./virtualColumns/VirtualColumnCard";
74
+ export type { VirtualColumnCardProps } from "./virtualColumns/VirtualColumnCard";
75
+ export { arrangeGroupedColumns } from "./content/TableContent";
76
+ export type { GroupedColumnMode } from "./content/TableContent";
77
+ export { summarizeSearch, formatConditionValue, countActiveConditions, isActiveCondition, EMPTY_VALUE_TEXT, VALUELESS_TEXT, } from "./addons/searchSummary";
78
+ export type { SearchSummary, ConditionSummary, ConditionStatus, SortSummary, SummarizeSearchOptions, FormatConditionValueOptions, } from "./addons/searchSummary";
79
+ export { FilterStatusContent, FilterStatusModal, FilterStatusButton, useFilterStatusSummary, } from "./addons/FilterStatusModal";
80
+ export type { FilterStatusContentProps, FilterStatusModalProps, FilterStatusButtonProps, FilterStatusSearch, } from "./addons/FilterStatusModal";
81
+ export { ShareDropdown } from "./addons/ShareDropdown";
82
+ export type { ShareDropdownProps, ShareAction, ShareDropdownMessages } from "./addons/ShareDropdown";
83
+ export { createSearchStore, useSearchStore, useSearchStoreBridge } from "./addons/searchStore";
84
+ export type { SearchStore, SearchStoreSnapshot, SearchStoreActions, CreateSearchStoreOptions, } from "./addons/searchStore";
85
+ export { FilterModal, FilterModalButton } from "./addons/FilterModal";
86
+ export type { FilterModalProps, FilterModalButtonProps, FilterModalSearch } from "./addons/FilterModal";
87
+ export { KokoTableProvider, useKokoTableConfig, resolveTableProps, mergeKokoTableConfig, DEFAULT_KOKO_TABLE_CONFIG, DEFAULT_TABLE_DEFAULTS, toRegistry, applyPatch, } from "./provider/KokoTableProvider";
88
+ export type { KokoTableProviderProps, KokoTableConfig, KokoTableConfigInput, KokoTableComponents, KokoTableDefaults, KokoCellRenderers, KokoFilterInputs, CellRenderer, CellRendererKey, CellRendererProps, EmptyStateProps, LoadingSkeletonProps, GroupRowRenderContext, DetailPanelRowContext, KokoTableMenus, KokoTableMenusInput, KokoTableRegistries, KokoFilterKinds, FilterKindUi, OpenFilterHandler, } from "./provider/KokoTableProvider";
89
+ export { DEFAULT_LABELS, DEFAULT_UI_LABELS, mergeLabels } from "./provider/labels";
90
+ export type { KokoTableLabels, KokoTableLabelsInput, KokoUiLabels } from "./provider/labels";
91
+ export { MenuItemList, ContextMenu, defaultColumnMenuItems, defaultRowMenuItems, defaultGroupRowMenuItems, visibleMenuItems, createHeaderContext, createColumnMenuCtx, createRowMenuCtx, } from "./content/menuItems";
92
+ export type { MenuItemSpec, ColumnMenuItem, ColumnMenuContext, ColumnMenuItemsContext, ColumnMenuItemsFn, RowMenuItem, RowMenuContext, RowMenuItemsFn, MenuItemListProps, ContextMenuProps, } from "./content/menuItems";
93
+ export type { RenderHeaderContext } from "./content/HeaderCell";
94
+ export type { ColumnMenuAnchor } from "./content/ColumnMenu";
95
+ export { createRegistry, isRegistry } from "./registry";
96
+ export type { Registry, RegistryPatch, MenuItemDef, MenuPatch, CellRendererDef, AggregationDef, ExportFormatterDef, } from "./registry";
97
+ export { defineHeader, resolveHeaderDef, applyHeaderRules, headerMetaOf, defaultHeader, compactHeader, headerRegistry, defaultHeaderSlots, renderDefaultHeader, materializeHeader, SortArrow, headerRuleMetaOf, resolveCellAlign, } from "./headers";
98
+ export type { HeaderContext, HeaderRenderContext, HeaderCapabilities, HeaderSlots, HeaderSlot, HeaderRules, HeaderDef, HeaderMeta, HeaderAlign, HeaderRuleMeta, CellAlign, } from "./headers";
99
+ export { columnMenuRegistry, defaultColumnMenuDefs, columnHeaderText, COLUMN_MENU_GROUP, rowMenuRegistry, defaultRowMenuDefs, rowCopyText, ROW_MENU_GROUP, resolveMenuDefs, menuSpecsFrom, copyToClipboard, } from "./menus";
100
+ export type { ColumnMenuCtx, ColumnMenuItemDef, ColumnMenuPatch, RowMenuCtx, RowMenuItemDef, RowMenuPatch, GroupRowCtx, } from "./menus";
101
+ export { PresetBar } from "./addons/PresetBar";
102
+ export type { PresetBarProps, PresetBarMessages } from "./addons/PresetBar";
103
+ export { TableScreen, TableScreenBase, displayColumnOptionsOf } from "./TableScreen";
104
+ export type { TableScreenProps, TableScreenBaseProps, TableScreenSlots, SlotValue } from "./TableScreen";
105
+ export { cellRenderers, defineCellRenderer, resolveCellRenderer, toCellRendererDefs, useCellRenderers, layerRegistry, registriesOf, isEmptyCellValue, BUILTIN_CELL_RENDERERS, } from "./content/cellRenderers";
106
+ export type { CellContext, CellRendererId, KokoRegistries } from "./content/cellRenderers";
107
+ export { useAggregations, aggChipColor } from "./grouping/AggregateChip";
108
+ export { useExportFormatters } from "./exporters";
109
+ export { AggregationSettingsButton } from "./grouping/AggregationSettingsButton";
110
+ export type { AggregationSettingsButtonProps } from "./grouping/AggregationSettingsButton";