react-restyle-components 0.4.37 → 0.4.39

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 (225) hide show
  1. package/lib/index.js +1 -3
  2. package/lib/src/core-components/index.js +1 -1
  3. package/lib/src/core-components/src/components/Accordion/AccordionSection/Accordion.js +1 -15
  4. package/lib/src/core-components/src/components/Accordion/AccordionSection/AccordionContext.js +1 -6
  5. package/lib/src/core-components/src/components/Accordion/AccordionSection/AccordionSection.js +1 -39
  6. package/lib/src/core-components/src/components/Accordion/AccordionSection/Header.js +1 -39
  7. package/lib/src/core-components/src/components/Accordion/AccordionSection/elements.js +57 -94
  8. package/lib/src/core-components/src/components/Accordion/AccordionSection/hooks/useCurrentAccordionIndex.js +1 -13
  9. package/lib/src/core-components/src/components/Accordion/AccordionSection/index.js +1 -3
  10. package/lib/src/core-components/src/components/Accordion/AccordionSection/types.js +1 -9
  11. package/lib/src/core-components/src/components/Accordion/Collapsible/Collapsible2.component.js +1 -249
  12. package/lib/src/core-components/src/components/Action/types.js +1 -8
  13. package/lib/src/core-components/src/components/AlertBanner/AlertBanner.js +1 -45
  14. package/lib/src/core-components/src/components/AlertBanner/elements.js +45 -120
  15. package/lib/src/core-components/src/components/AlertBanner/index.js +1 -2
  16. package/lib/src/core-components/src/components/AlertBanner/types.js +1 -10
  17. package/lib/src/core-components/src/components/AutoComplete/auto-complete-filter-group-by-multiple-select-multiple-fields-display/auto-complete-filter-group-by-multiple-select-multiple-fields-display.component.js +1 -334
  18. package/lib/src/core-components/src/components/AutoComplete/auto-complete-filter-multi-select-multi-fields-display-drag-drop/auto-complete-filter-multi-select-multi-fields-display-drag-drop.component.js +1 -229
  19. package/lib/src/core-components/src/components/AutoComplete/auto-complete-filter-multi-select-selected-top-display/auto-complete-filter-multi-select-selected-top-display.component.js +1 -174
  20. package/lib/src/core-components/src/components/AutoComplete/auto-complete-filter-multiple-select-multiple-fields-display/auto-complete-filter-multiple-select-multiple-fields-display.component.js +2 -129
  21. package/lib/src/core-components/src/components/AutoComplete/auto-complete-filter-single-select/auto-complete-filter-single-select.component.js +1 -55
  22. package/lib/src/core-components/src/components/AutoComplete/auto-complete-filter-single-select-multiple-fields-display/auto-complete-filter-single-select-multiple-fields-display.component.js +2 -308
  23. package/lib/src/core-components/src/components/AutoComplete/auto-complete-group-by/auto-complete-group-by.component.js +1 -115
  24. package/lib/src/core-components/src/components/AutoComplete/autocomplete/autocomplete.js +2 -442
  25. package/lib/src/core-components/src/components/AutoComplete/index.js +1 -8
  26. package/lib/src/core-components/src/components/Avatar/Avatar.js +14 -148
  27. package/lib/src/core-components/src/components/Badge/Badge.js +2 -25
  28. package/lib/src/core-components/src/components/Badge/InnerBadge/Inline.js +1 -25
  29. package/lib/src/core-components/src/components/Badge/InnerBadge/InnerBadge.js +1 -25
  30. package/lib/src/core-components/src/components/Badge/InnerBadge/elements.js +32 -78
  31. package/lib/src/core-components/src/components/Badge/InnerBadge/index.js +1 -1
  32. package/lib/src/core-components/src/components/Badge/index.js +1 -1
  33. package/lib/src/core-components/src/components/Badge/types.js +1 -5
  34. package/lib/src/core-components/src/components/Breadcrumb/Breadcrumb.js +1 -83
  35. package/lib/src/core-components/src/components/Breadcrumb/elements.js +94 -166
  36. package/lib/src/core-components/src/components/Breadcrumb/index.js +1 -3
  37. package/lib/src/core-components/src/components/Breadcrumb/types.js +1 -3
  38. package/lib/src/core-components/src/components/Button/button.component.js +1 -18
  39. package/lib/src/core-components/src/components/Button/buttonGroup/buttonGroup.component.js +1 -4
  40. package/lib/src/core-components/src/components/Button/index.js +1 -2
  41. package/lib/src/core-components/src/components/Button/types.js +1 -1
  42. package/lib/src/core-components/src/components/Chip/Chip.js +1 -64
  43. package/lib/src/core-components/src/components/Chip/elements.js +48 -148
  44. package/lib/src/core-components/src/components/Chip/index.js +1 -2
  45. package/lib/src/core-components/src/components/Chip/types.js +1 -4
  46. package/lib/src/core-components/src/components/Divider/Divider.js +1 -25
  47. package/lib/src/core-components/src/components/Divider/elements.js +31 -68
  48. package/lib/src/core-components/src/components/Divider/index.js +1 -2
  49. package/lib/src/core-components/src/components/Divider/types.js +1 -4
  50. package/lib/src/core-components/src/components/DynamicGrid/DynamicGrid.js +1 -147
  51. package/lib/src/core-components/src/components/DynamicGrid/GridContainer.js +17 -24
  52. package/lib/src/core-components/src/components/DynamicGrid/elements.js +100 -162
  53. package/lib/src/core-components/src/components/DynamicGrid/index.js +1 -3
  54. package/lib/src/core-components/src/components/DynamicGrid/types.js +1 -28
  55. package/lib/src/core-components/src/components/DynamicGrid/utils.js +1 -193
  56. package/lib/src/core-components/src/components/FormField/FormField.js +1 -103
  57. package/lib/src/core-components/src/components/FormField/components/CheckboxGroupInput.js +1 -37
  58. package/lib/src/core-components/src/components/FormField/components/CheckboxInput.js +1 -8
  59. package/lib/src/core-components/src/components/FormField/components/CssMultilineInput.js +1 -192
  60. package/lib/src/core-components/src/components/FormField/components/DatePickerInput.js +1 -99
  61. package/lib/src/core-components/src/components/FormField/components/DropdownInput.js +1 -70
  62. package/lib/src/core-components/src/components/FormField/components/OtpInput.js +1 -81
  63. package/lib/src/core-components/src/components/FormField/components/PasswordInput.js +1 -40
  64. package/lib/src/core-components/src/components/FormField/components/PinInput.js +1 -75
  65. package/lib/src/core-components/src/components/FormField/components/RadioInput.js +1 -54
  66. package/lib/src/core-components/src/components/FormField/components/TextDropdownInput.js +1 -94
  67. package/lib/src/core-components/src/components/FormField/components/ToggleInput.js +1 -36
  68. package/lib/src/core-components/src/components/FormField/components/index.js +1 -11
  69. package/lib/src/core-components/src/components/FormField/css-properties.js +1 -161
  70. package/lib/src/core-components/src/components/FormField/index.js +1 -2
  71. package/lib/src/core-components/src/components/Icon/Icon.js +1 -79
  72. package/lib/src/core-components/src/components/Icon/index.js +1 -2
  73. package/lib/src/core-components/src/components/Icon/types.js +1 -9
  74. package/lib/src/core-components/src/components/Loader/loader.component.js +2 -215
  75. package/lib/src/core-components/src/components/Masonry/Masonry.js +1 -73
  76. package/lib/src/core-components/src/components/Masonry/elements.js +29 -46
  77. package/lib/src/core-components/src/components/Masonry/hooks.js +1 -100
  78. package/lib/src/core-components/src/components/Masonry/index.js +1 -3
  79. package/lib/src/core-components/src/components/Masonry/types.js +1 -1
  80. package/lib/src/core-components/src/components/Modal/BasicModal/modal.component.js +1 -116
  81. package/lib/src/core-components/src/components/Modal/index.js +1 -2
  82. package/lib/src/core-components/src/components/Modal/modal-confirm/modal-confirm.component.js +1 -147
  83. package/lib/src/core-components/src/components/Picker/color-picker/color-picker.component.js +1 -12
  84. package/lib/src/core-components/src/components/Picker/color-picker-modal/color-picker-modal.component.js +1 -40
  85. package/lib/src/core-components/src/components/Picker/index.js +1 -2
  86. package/lib/src/core-components/src/components/Selection/index.js +1 -4
  87. package/lib/src/core-components/src/components/Selection/multi-select/multi-select.component.js +1 -49
  88. package/lib/src/core-components/src/components/Selection/multi-select-with-field/multi-select-with-field.component.js +1 -58
  89. package/lib/src/core-components/src/components/Selection/multi-selection-dropdown/multi-selection-dropdown.component.js +1 -43
  90. package/lib/src/core-components/src/components/Selection/single-select/single-select.component.js +1 -87
  91. package/lib/src/core-components/src/components/Skeleton/Skeleton.js +1 -51
  92. package/lib/src/core-components/src/components/Skeleton/elements.js +54 -143
  93. package/lib/src/core-components/src/components/Skeleton/index.js +1 -2
  94. package/lib/src/core-components/src/components/Skeleton/types.js +1 -4
  95. package/lib/src/core-components/src/components/SpeedDial/SpeedDial.js +1 -128
  96. package/lib/src/core-components/src/components/SpeedDial/elements.js +62 -132
  97. package/lib/src/core-components/src/components/SpeedDial/index.js +1 -2
  98. package/lib/src/core-components/src/components/SpeedDial/types.js +1 -3
  99. package/lib/src/core-components/src/components/Stepper2/stepper.component.js +1 -139
  100. package/lib/src/core-components/src/components/Switch/Switch.js +1 -26
  101. package/lib/src/core-components/src/components/Switch/elements.js +34 -103
  102. package/lib/src/core-components/src/components/Switch/index.js +1 -2
  103. package/lib/src/core-components/src/components/Switch/types.js +1 -3
  104. package/lib/src/core-components/src/components/Table/Table.js +1 -1100
  105. package/lib/src/core-components/src/components/Table/elements.js +153 -240
  106. package/lib/src/core-components/src/components/Table/filters.js +30 -555
  107. package/lib/src/core-components/src/components/Table/hooks.js +2 -536
  108. package/lib/src/core-components/src/components/Table/index.js +1 -4
  109. package/lib/src/core-components/src/components/Table/types.js +1 -1
  110. package/lib/src/core-components/src/components/Tabs/tabs.component.js +1 -22
  111. package/lib/src/core-components/src/components/Tags1/Tags.component.js +1 -118
  112. package/lib/src/core-components/src/components/Tags1/types.js +1 -20
  113. package/lib/src/core-components/src/components/Timer1/timer.component.js +1 -76
  114. package/lib/src/core-components/src/components/Toast/Toast.js +1 -50
  115. package/lib/src/core-components/src/components/Toast/elements.js +41 -122
  116. package/lib/src/core-components/src/components/Toast/index.js +1 -2
  117. package/lib/src/core-components/src/components/Toast/types.js +1 -9
  118. package/lib/src/core-components/src/components/Tooltip/Tooltip.js +1 -200
  119. package/lib/src/core-components/src/components/Tooltip/elements.js +55 -117
  120. package/lib/src/core-components/src/components/Tooltip/index.js +1 -2
  121. package/lib/src/core-components/src/components/Tooltip/types.js +1 -17
  122. package/lib/src/core-components/src/components/Tooltip/utils.js +1 -140
  123. package/lib/src/core-components/src/components/TreeSelect/TreeSelect.js +1 -303
  124. package/lib/src/core-components/src/components/TreeSelect/elements.js +117 -216
  125. package/lib/src/core-components/src/components/TreeSelect/hooks.js +1 -252
  126. package/lib/src/core-components/src/components/TreeSelect/index.js +1 -3
  127. package/lib/src/core-components/src/components/TreeSelect/types.js +1 -1
  128. package/lib/src/core-components/src/components/index.js +1 -30
  129. package/lib/src/core-components/src/components/pdf/pdf-images.components.js +1 -7
  130. package/lib/src/core-components/src/components/pdf/pdf-table.components.js +5 -48
  131. package/lib/src/core-components/src/components/pdf/pdf-typography.components.js +1 -70
  132. package/lib/src/core-components/src/components/pdf/pdf-wrapped-view.components.js +1 -50
  133. package/lib/src/core-components/src/core-components/Avatar.js +4 -33
  134. package/lib/src/core-components/src/core-components/CoreButton/CoreButton.js +1 -10
  135. package/lib/src/core-components/src/core-components/CoreButton/elements.js +67 -176
  136. package/lib/src/core-components/src/core-components/CoreButton/index.js +1 -3
  137. package/lib/src/core-components/src/core-components/CoreButton/types.js +1 -6
  138. package/lib/src/core-components/src/core-components/CoreButton/utils.js +1 -12
  139. package/lib/src/core-components/src/core-components/Divider/Divider.js +4 -19
  140. package/lib/src/core-components/src/core-components/Divider/index.js +1 -1
  141. package/lib/src/core-components/src/core-components/SelectionCardStrip/index.js +1 -1
  142. package/lib/src/core-components/src/core-components/SelectionCardStrip/selectionCardStrip.js +10 -33
  143. package/lib/src/core-components/src/core-components/StateLayer.js +3 -5
  144. package/lib/src/core-components/src/core-components/ToggleCore/elements.js +25 -50
  145. package/lib/src/core-components/src/core-components/ToggleCore/index.js +1 -2
  146. package/lib/src/core-components/src/core-components/ToggleCore/toggleCore.js +1 -14
  147. package/lib/src/core-components/src/core-components/atoms/Input/Input.js +1 -22
  148. package/lib/src/core-components/src/core-components/atoms/Label/Label.js +1 -21
  149. package/lib/src/core-components/src/core-components/atoms/Textarea/Textarea.js +1 -19
  150. package/lib/src/core-components/src/core-components/index.js +1 -3
  151. package/lib/src/core-components/src/helpers/constants.js +1 -11
  152. package/lib/src/core-components/src/hooks/index.js +1 -1
  153. package/lib/src/core-components/src/hooks/outside.hook.js +1 -28
  154. package/lib/src/core-components/src/index.js +1 -12
  155. package/lib/src/core-components/src/tc.global.css +1 -0
  156. package/lib/src/core-components/src/utils/abstracts/breakpoints/index.js +1 -28
  157. package/lib/src/core-components/src/utils/abstracts/colors/index.js +1 -49
  158. package/lib/src/core-components/src/utils/abstracts/index.js +1 -5
  159. package/lib/src/core-components/src/utils/abstracts/space/index.js +1 -26
  160. package/lib/src/core-components/src/utils/abstracts/theme/ThemeBoundary.js +1 -8
  161. package/lib/src/core-components/src/utils/abstracts/theme/default-themes.js +1 -30
  162. package/lib/src/core-components/src/utils/abstracts/theme/index.js +1 -3
  163. package/lib/src/core-components/src/utils/abstracts/theme/theme.js +1 -30
  164. package/lib/src/core-components/src/utils/abstracts/theme/types.js +1 -1
  165. package/lib/src/core-components/src/utils/abstracts/theme/useTheme.js +1 -17
  166. package/lib/src/core-components/src/utils/abstracts/typography/index.js +1 -25
  167. package/lib/src/core-components/src/utils/context/DefaultsProvider.js +1 -8
  168. package/lib/src/core-components/src/utils/context/InternalProvider.js +1 -24
  169. package/lib/src/core-components/src/utils/context/index.js +1 -2
  170. package/lib/src/core-components/src/utils/designTokens.js +1 -125
  171. package/lib/src/core-components/src/utils/helpers/attachSubComponents.js +1 -23
  172. package/lib/src/core-components/src/utils/helpers/flattenChildren.js +1 -11
  173. package/lib/src/core-components/src/utils/helpers/getChildByType.js +1 -3
  174. package/lib/src/core-components/src/utils/helpers/index.js +1 -5
  175. package/lib/src/core-components/src/utils/helpers/isComponentType.js +1 -16
  176. package/lib/src/core-components/src/utils/helpers/separateChildrenByType.js +1 -12
  177. package/lib/src/core-components/src/utils/hooks/index.js +1 -18
  178. package/lib/src/core-components/src/utils/hooks/useClickOutside.js +1 -18
  179. package/lib/src/core-components/src/utils/hooks/useCombinedRefs.js +1 -17
  180. package/lib/src/core-components/src/utils/hooks/useDebouncedCallback.js +1 -12
  181. package/lib/src/core-components/src/utils/hooks/useDebouncedValue.js +1 -20
  182. package/lib/src/core-components/src/utils/hooks/useDeprecation.js +1 -40
  183. package/lib/src/core-components/src/utils/hooks/useDeviceDetect.js +1 -10
  184. package/lib/src/core-components/src/utils/hooks/useDeviceForm.js +1 -24
  185. package/lib/src/core-components/src/utils/hooks/useDisableBodyScroll.js +1 -16
  186. package/lib/src/core-components/src/utils/hooks/useHoverState.js +1 -36
  187. package/lib/src/core-components/src/utils/hooks/useId.js +1 -7
  188. package/lib/src/core-components/src/utils/hooks/useIsBrowser.js +1 -11
  189. package/lib/src/core-components/src/utils/hooks/useMediaQuery.js +1 -16
  190. package/lib/src/core-components/src/utils/hooks/useOverflow.js +1 -22
  191. package/lib/src/core-components/src/utils/hooks/useSafeLayoutEffect.js +1 -5
  192. package/lib/src/core-components/src/utils/hooks/useScrollingUp.js +1 -18
  193. package/lib/src/core-components/src/utils/hooks/useTrapFocus.js +1 -30
  194. package/lib/src/core-components/src/utils/hooks/useWindowDimensions.js +1 -23
  195. package/lib/src/core-components/src/utils/index.js +1 -9
  196. package/lib/src/core-components/src/utils/stories/Wrappers.js +8 -23
  197. package/lib/src/core-components/src/utils/stories/cleanProps.js +1 -5
  198. package/lib/src/core-components/src/utils/stories/index.js +1 -4
  199. package/lib/src/core-components/src/utils/stories/sleep.js +1 -4
  200. package/lib/src/core-components/src/utils/stories/view-ports.js +1 -50
  201. package/lib/src/core-components/src/utils/styling/calcWidthOfColumns.js +1 -5
  202. package/lib/src/core-components/src/utils/styling/createGridContainer.js +6 -12
  203. package/lib/src/core-components/src/utils/styling/createTransition.js +2 -7
  204. package/lib/src/core-components/src/utils/styling/forwardProps.js +1 -10
  205. package/lib/src/core-components/src/utils/styling/index.js +1 -5
  206. package/lib/src/core-components/src/utils/styling/pxToRem.js +1 -6
  207. package/lib/src/core-components/src/utils/testing/getComputedStyle.js +1 -3
  208. package/lib/src/core-components/src/utils/testing/index.js +1 -1
  209. package/lib/src/core-components/src/utils/utility.util.js +1 -14
  210. package/lib/src/core-components/tailwind.config.js +1 -233
  211. package/lib/src/core-hooks/index.js +1 -3
  212. package/lib/src/core-hooks/src/useClickOutside/useClickOutside.hook.js +1 -46
  213. package/lib/src/core-hooks/src/useDebounce/useDebounce.hook.js +1 -30
  214. package/lib/src/core-hooks/src/usePreventEKey/usePreventEKey.hook.js +1 -8
  215. package/lib/src/core-utils/index.js +1 -7
  216. package/lib/src/core-utils/src/calculation/calculation.util.js +1 -89
  217. package/lib/src/core-utils/src/colors/color.util.js +1 -15
  218. package/lib/src/core-utils/src/convert/numberToWords/numToWords.util.js +1 -145
  219. package/lib/src/core-utils/src/convert/typography/camelCaseToTitleCase.util.js +1 -5
  220. package/lib/src/core-utils/src/form-helper/form-helper.util.js +1 -82
  221. package/lib/src/core-utils/src/index.js +1 -7
  222. package/lib/src/core-utils/src/utility/utility.util.js +1 -12
  223. package/lib/src/core-utils/src/uuid/uuid.util.js +1 -8
  224. package/package.json +2 -1
  225. package/lib/src/core-components/src/assets/styles/fontface.css +0 -17
@@ -1,1100 +1 @@
1
- 'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import React, { forwardRef, useState, useCallback, useMemo, useEffect, useRef, } from 'react';
4
- import { TableRoot, Toolbar, ToolbarGroup, SearchInput, ToolbarButton, TableWrapper, StyledTable, TableHeader, HeaderRow, HeaderCell, TableBody, TableRow, TableCell, Checkbox, ExpandButton, ExpandedRow, ExpandedCell, TableFooter, FooterRow, FooterCell, PaginationWrapper, PaginationInfo, PaginationControls, PageButton, PageSizeSelect, QuickJumper, EmptyState, LoadingOverlay, LoadingSpinner, EditableCell, CellEditor, ColumnTogglePanel, ColumnToggleHeader, ColumnToggleSearch, ColumnToggleList, ColumnToggleItem, SelectionIndicator, SelectionCount, } from './elements';
5
- import { useSortState, useFilterState, usePaginationState, useRowSelection, useRowExpansion, useColumnVisibility, useTableDebounce, sortData, filterData, paginateData, getNestedValue, exportToCSV, exportToExcel, } from './hooks';
6
- import { getFilterComponent } from './filters';
7
- import { Tooltip } from '../Tooltip';
8
- // Icons
9
- const SearchIcon = () => (_jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: [_jsx("circle", { cx: "11", cy: "11", r: "8" }), _jsx("path", { d: "M21 21l-4.35-4.35", strokeLinecap: "round" })] }));
10
- // Arrow Up Icon with configurable size
11
- const ArrowUpIcon = ({ size = 14 }) => (_jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", style: { width: size, height: size }, children: _jsx("path", { d: "M12 19V5M5 12l7-7 7 7" }) }));
12
- // Arrow Down Icon with configurable size
13
- const ArrowDownIcon = ({ size = 14 }) => (_jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", style: { width: size, height: size }, children: _jsx("path", { d: "M12 5v14M5 12l7 7 7-7" }) }));
14
- // Legacy triangle icons (kept for backward compatibility)
15
- const SortUpIcon = () => (_jsx("svg", { viewBox: "0 0 10 10", fill: "currentColor", children: _jsx("path", { d: "M5 0L10 6H0L5 0z" }) }));
16
- const SortDownIcon = () => (_jsx("svg", { viewBox: "0 0 10 10", fill: "currentColor", children: _jsx("path", { d: "M5 10L0 4h10L5 10z" }) }));
17
- // Default sort caret component with arrow icons
18
- const DefaultSortCaret = ({ order, }) => {
19
- const getSizeConfig = () => {
20
- switch (order) {
21
- case 'asc':
22
- return { up: 16, down: 10 };
23
- case 'desc':
24
- return { up: 10, down: 16 };
25
- default:
26
- return { up: 14, down: 14 };
27
- }
28
- };
29
- const { up, down } = getSizeConfig();
30
- return (_jsxs("div", { style: {
31
- display: 'flex',
32
- flexDirection: 'row',
33
- alignItems: 'center',
34
- justifyContent: 'center',
35
- gap: 2,
36
- color: 'white',
37
- }, children: [_jsx(ArrowUpIcon, { size: up }), _jsx(ArrowDownIcon, { size: down })] }));
38
- };
39
- const ChevronLeftIcon = () => (_jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M15 18l-6-6 6-6", strokeLinecap: "round", strokeLinejoin: "round" }) }));
40
- const ChevronRightIcon = () => (_jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M9 18l6-6-6-6", strokeLinecap: "round", strokeLinejoin: "round" }) }));
41
- const ChevronsLeftIcon = () => (_jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M11 17l-5-5 5-5M18 17l-5-5 5-5", strokeLinecap: "round", strokeLinejoin: "round" }) }));
42
- const ChevronsRightIcon = () => (_jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M13 7l5 5-5 5M6 7l5 5-5 5", strokeLinecap: "round", strokeLinejoin: "round" }) }));
43
- const ExpandIcon = () => (_jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M9 18l6-6-6-6", strokeLinecap: "round", strokeLinejoin: "round" }) }));
44
- const CloseIcon = () => (_jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M18 6L6 18M6 6l12 12", strokeLinecap: "round", strokeLinejoin: "round" }) }));
45
- const FilterIcon = () => (_jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M22 3H2l8 9.46V19l4 2v-8.54L22 3z", strokeLinecap: "round", strokeLinejoin: "round" }) }));
46
- const DownloadIcon = () => (_jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4M7 10l5 5 5-5M12 15V3", strokeLinecap: "round", strokeLinejoin: "round" }) }));
47
- const ColumnsIcon = () => (_jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: [_jsx("rect", { x: "3", y: "3", width: "7", height: "18", rx: "1" }), _jsx("rect", { x: "14", y: "3", width: "7", height: "18", rx: "1" })] }));
48
- const EmptyIcon = () => (_jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: [_jsx("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2" }), _jsx("path", { d: "M3 9h18M9 3v18", strokeLinecap: "round" })] }));
49
- const RefreshIcon = () => (_jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: [_jsx("path", { d: "M23 4v6h-6M1 20v-6h6", strokeLinecap: "round", strokeLinejoin: "round" }), _jsx("path", { d: "M3.51 9a9 9 0 0114.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0020.49 15", strokeLinecap: "round", strokeLinejoin: "round" })] }));
50
- const PrintIcon = () => (_jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: [_jsx("path", { d: "M6 9V2h12v7M6 18H4a2 2 0 01-2-2v-5a2 2 0 012-2h16a2 2 0 012 2v5a2 2 0 01-2 2h-2", strokeLinecap: "round", strokeLinejoin: "round" }), _jsx("rect", { x: "6", y: "14", width: "12", height: "8" })] }));
51
- const ErrorIcon = () => (_jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("path", { d: "M12 8v4M12 16h.01", strokeLinecap: "round", strokeLinejoin: "round" })] }));
52
- export const Table = forwardRef(function TableComponent(props, ref) {
53
- const { id, data, columns, keyField = '_id', loading = false, loadingIndicator, pagination = true, paginationConfig, totalSize, remote = true, defaultSort, sort: controlledSort, filterable = false, defaultFilters, filters: controlledFilters, defaultShowFilters = true, showFilters: controlledShowFilters, onShowFiltersChange, showFilterToggle = true, searchable = true, searchPlaceholder = 'Search...', defaultSearchValue = '', searchValue: controlledSearchValue, searchDebounce = 300, rowSelection, expandable, editMode = 'dblclick', showEditIcon = false, onCellEdit, exportable = true, exportFileName = 'table_export', exportFormat = 'csv', columnToggle = false, bordered = true, striped = false, hover = true, compact = false, cellPadding, stickyHeader = false, maxHeight, rowClassName, rowStyle, classNames = {}, styles = {}, className, style, emptyText = 'No data available', onChange, onPageChange, onSortChange, onFilterChange, onSearch, onRowClick, onRowDoubleClick, onClearFilters, toolbar, hideToolbar = false, showFooter = false, caption,
54
- // Quick configuration props
55
- isDelete = false, isEditModify, isUpdate, isExport, isSelectRow, getNonSelectableRows, nonSelectableStyle, isView = false, fileName, hideExcelSheet = false,
56
- // Quick callbacks
57
- onSelectedRow, selectedRowStyle, selectedRowClassName, onUpdateItem, onPageSizeChange, onFilter, clearAllFilter, onDelete, onEdit, onView,
58
- // Dynamic configuration
59
- dynamicStylingFields, fieldTypeConfig,
60
- // Row number
61
- showRowNumber = false, rowNumberWidth = 50, rowNumberTitle = '#', rowNumberRender,
62
- // Toolbar customization
63
- toolbarPosition = 'top', toolbarLeft, toolbarRight, toolbarCenter,
64
- // Refresh
65
- refreshable = false, onRefresh,
66
- // Print
67
- printable = false, onPrint,
68
- // Size
69
- size = 'medium',
70
- // Error state
71
- error, onRetry,
72
- // Skeleton loading
73
- skeletonLoading = false, skeletonRowCount = 5,
74
- // Hide header
75
- hideHeader = false,
76
- // Highlighted rows
77
- highlightedRowKeys = [], highlightRowStyle, highlightRowClassName,
78
- // Events
79
- onRowMouseEnter, onRowMouseLeave, onCellClick, onHeaderClick, ...rest } = props;
80
- // Resolve aliases
81
- const resolvedExportable = isExport ?? exportable;
82
- const resolvedExportFileName = fileName ?? exportFileName;
83
- // Auto-detect remote mode: if totalSize <= data.length, use client-side (remote=false)
84
- const resolvedRemote = useMemo(() => {
85
- // If totalSize is provided and is <= data.length, all data is loaded - use client-side
86
- if (totalSize !== undefined &&
87
- totalSize > 0 &&
88
- totalSize <= data.length) {
89
- return false;
90
- }
91
- // Otherwise use the prop value (default: true)
92
- return remote;
93
- }, [remote, totalSize, data.length]);
94
- // Handle isSelectRow shorthand
95
- const resolvedRowSelection = isSelectRow
96
- ? {
97
- mode: 'checkbox',
98
- selectedRowStyle: selectedRowStyle || rowSelection?.selectedRowStyle,
99
- selectedRowClassName: selectedRowClassName || rowSelection?.selectedRowClassName,
100
- ...rowSelection,
101
- // Merge getNonSelectableRows with existing getCheckboxProps
102
- getCheckboxProps: (row) => {
103
- const rowKey = row[keyField];
104
- const isNonSelectable = getNonSelectableRows?.includes(rowKey);
105
- const existingProps = rowSelection?.getCheckboxProps?.(row);
106
- return {
107
- ...existingProps,
108
- disabled: isNonSelectable || existingProps?.disabled,
109
- };
110
- },
111
- onChange: (keys, rows) => {
112
- rowSelection?.onChange?.(keys, rows);
113
- // Note: onSelectedRow is only called when user clicks the "X Selected" button
114
- },
115
- }
116
- : rowSelection;
117
- // Default pagination config - users don't need to pass these
118
- const resolvedPaginationConfig = pagination
119
- ? {
120
- page: 0,
121
- pageSize: 10,
122
- showSizeChanger: true,
123
- showQuickJumper: true,
124
- showTotal: true,
125
- pageSizeOptions: [10, 20, 30, 50],
126
- ...paginationConfig,
127
- }
128
- : paginationConfig;
129
- // Size configuration
130
- const sizeConfig = {
131
- small: { padding: '4px 8px', fontSize: '12px' },
132
- medium: { padding: '8px 12px', fontSize: '14px' },
133
- large: { padding: '12px 16px', fontSize: '16px' },
134
- };
135
- // Refs
136
- const tableRef = useRef(null);
137
- const columnToggleRef = useRef(null);
138
- const prevSelectionCountRef = useRef(0);
139
- // State
140
- const [internalSearchValue, setInternalSearchValue] = useState(defaultSearchValue);
141
- const [internalShowFilters, setInternalShowFilters] = useState(defaultShowFilters);
142
- const [columnToggleOpen, setColumnToggleOpen] = useState(false);
143
- const [columnSearch, setColumnSearch] = useState('');
144
- const [selectionAnimation, setSelectionAnimation] = useState('none');
145
- // Close column toggle panel on outside click
146
- useEffect(() => {
147
- if (!columnToggleOpen)
148
- return;
149
- const handleClickOutside = (event) => {
150
- if (columnToggleRef.current &&
151
- !columnToggleRef.current.contains(event.target)) {
152
- setColumnToggleOpen(false);
153
- }
154
- };
155
- document.addEventListener('mousedown', handleClickOutside);
156
- return () => {
157
- document.removeEventListener('mousedown', handleClickOutside);
158
- };
159
- }, [columnToggleOpen]);
160
- // Filter visibility (controlled or uncontrolled)
161
- const isFilterVisibilityControlled = controlledShowFilters !== undefined;
162
- const showFilterRow = isFilterVisibilityControlled
163
- ? controlledShowFilters
164
- : internalShowFilters;
165
- const handleToggleFilters = useCallback(() => {
166
- const newValue = !showFilterRow;
167
- if (!isFilterVisibilityControlled) {
168
- setInternalShowFilters(newValue);
169
- }
170
- onShowFiltersChange?.(newValue);
171
- }, [showFilterRow, isFilterVisibilityControlled, onShowFiltersChange]);
172
- const [editingCell, setEditingCell] = useState(null);
173
- const [editValue, setEditValue] = useState(null);
174
- const searchValue = controlledSearchValue ?? internalSearchValue;
175
- const debouncedSearchValue = useTableDebounce(searchValue, searchDebounce);
176
- // Sort state
177
- const { sort, handleSort } = useSortState(defaultSort, controlledSort);
178
- // Filter state
179
- const { filters, setFilter, clearFilters } = useFilterState(defaultFilters, controlledFilters);
180
- // Track if onFilter should be called (only after user interaction)
181
- const shouldCallOnFilter = useRef(false);
182
- const filterTypeRef = useRef('filter');
183
- const onFilterRef = useRef(onFilter);
184
- // Track last called values to prevent duplicate calls
185
- const lastOnFilterCallRef = useRef(null);
186
- // Track focused filter field to restore focus after data changes
187
- const focusedFilterFieldRef = useRef(null);
188
- const tableContainerRef = useRef(null);
189
- // Clear focus ref when clicking outside the table
190
- useEffect(() => {
191
- const handleClickOutside = (event) => {
192
- if (tableContainerRef.current &&
193
- !tableContainerRef.current.contains(event.target)) {
194
- focusedFilterFieldRef.current = null;
195
- }
196
- };
197
- document.addEventListener('mousedown', handleClickOutside);
198
- return () => {
199
- document.removeEventListener('mousedown', handleClickOutside);
200
- };
201
- }, []);
202
- // Restore filter focus after data changes
203
- useEffect(() => {
204
- const restoreFocus = () => {
205
- if (focusedFilterFieldRef.current && tableContainerRef.current) {
206
- const filterInput = tableContainerRef.current.querySelector(`[data-filter-field="${focusedFilterFieldRef.current}"]`);
207
- if (filterInput && document.activeElement !== filterInput) {
208
- filterInput.focus();
209
- // Move cursor to end of input
210
- const len = filterInput.value?.length || 0;
211
- filterInput.setSelectionRange(len, len);
212
- }
213
- }
214
- };
215
- // Try multiple times with increasing delays to handle async renders
216
- const timers = [
217
- requestAnimationFrame(() => restoreFocus()),
218
- setTimeout(() => restoreFocus(), 50),
219
- setTimeout(() => restoreFocus(), 150),
220
- ];
221
- return () => {
222
- timers.forEach((timer) => {
223
- if (typeof timer === 'number') {
224
- cancelAnimationFrame(timer);
225
- clearTimeout(timer);
226
- }
227
- });
228
- };
229
- }, [data]);
230
- // Pagination state
231
- const { page, pageSize, totalPages, goToPage, goToNextPage, goToPrevPage, goToFirstPage, goToLastPage, changePageSize, } = usePaginationState(resolvedPaginationConfig?.page || 0, resolvedPaginationConfig?.pageSize || 10, totalSize ?? data.length);
232
- // Row selection
233
- const { selectedKeys, isSelected, toggleRow, toggleAll, isAllSelected, isIndeterminate, } = useRowSelection(data, resolvedRowSelection?.keyField || keyField, resolvedRowSelection?.mode || 'none', resolvedRowSelection?.selectedRowKeys, resolvedRowSelection?.getCheckboxProps);
234
- // Row expansion
235
- const { expandedKeys, isExpanded, toggleExpand } = useRowExpansion(expandable?.keyField || keyField, expandable?.defaultExpandedRowKeys, expandable?.expandedRowKeys, expandable?.accordion);
236
- // Column visibility
237
- const { visibleColumns, toggleColumn, isColumnHidden } = useColumnVisibility(columns, id);
238
- // Keep onFilter ref updated
239
- useEffect(() => {
240
- onFilterRef.current = onFilter;
241
- }, [onFilter]);
242
- // Track previous values to detect actual changes
243
- const prevSearchRef = useRef(debouncedSearchValue);
244
- const prevFiltersRef = useRef(JSON.stringify(filters));
245
- // Call onFilter when filter/search values actually change
246
- // Note: filter components already debounce internally, so we use filters directly
247
- useEffect(() => {
248
- if (!shouldCallOnFilter.current)
249
- return;
250
- const currentFiltersStr = JSON.stringify(filters);
251
- const searchChanged = prevSearchRef.current !== debouncedSearchValue;
252
- const filtersChanged = prevFiltersRef.current !== currentFiltersStr;
253
- // Only proceed if search or filters actually changed
254
- if (!searchChanged && !filtersChanged) {
255
- shouldCallOnFilter.current = false;
256
- return;
257
- }
258
- // Update previous values
259
- prevSearchRef.current = debouncedSearchValue;
260
- prevFiltersRef.current = currentFiltersStr;
261
- // Clean up filters - remove null, undefined, and empty string values
262
- const cleanFilters = {};
263
- Object.keys(filters).forEach((key) => {
264
- const value = filters[key];
265
- if (value !== null && value !== undefined && value !== '') {
266
- cleanFilters[key] = value;
267
- }
268
- });
269
- const hasFilters = Object.keys(cleanFilters).length > 0;
270
- // Build filter data based on what type of filter changed
271
- // For 'search' type, include srText if not empty; for 'filter' type, only pass filters
272
- const filterData = { ...cleanFilters };
273
- if (filterTypeRef.current === 'search' && debouncedSearchValue) {
274
- filterData.srText = debouncedSearchValue;
275
- }
276
- // Always call onFilter when filters change (including when cleared)
277
- // Case 1: Global search cleared, column filters exist → filters only
278
- // Case 2: Global search cleared, no column filters → empty filters (reload all)
279
- // Case 3: Specific column cleared → remaining filters
280
- onFilterRef.current?.(filterTypeRef.current, filterData, page, pageSize);
281
- // Reset the flag after processing to prevent duplicate calls
282
- shouldCallOnFilter.current = false;
283
- }, [debouncedSearchValue, filters, page, pageSize]);
284
- // Track selection count changes for animation
285
- useEffect(() => {
286
- const currentCount = selectedKeys.size;
287
- const prevCount = prevSelectionCountRef.current;
288
- if (currentCount > prevCount) {
289
- setSelectionAnimation('up');
290
- }
291
- else if (currentCount < prevCount) {
292
- setSelectionAnimation('down');
293
- }
294
- prevSelectionCountRef.current = currentCount;
295
- // Reset animation after it completes
296
- const timer = setTimeout(() => {
297
- setSelectionAnimation('none');
298
- }, 300);
299
- return () => clearTimeout(timer);
300
- }, [selectedKeys.size]);
301
- // Process data (filter, sort, paginate)
302
- const processedData = useMemo(() => {
303
- if (resolvedRemote) {
304
- // Server-side processing - data is already processed
305
- return data;
306
- }
307
- let result = [...data];
308
- // Filter
309
- result = filterData(result, filters, columns, debouncedSearchValue);
310
- // Sort
311
- result = sortData(result, sort, columns);
312
- // Paginate
313
- if (pagination) {
314
- result = paginateData(result, page, pageSize);
315
- }
316
- return result;
317
- }, [
318
- data,
319
- filters,
320
- sort,
321
- page,
322
- pageSize,
323
- debouncedSearchValue,
324
- resolvedRemote,
325
- pagination,
326
- columns,
327
- ]);
328
- // Calculate total for pagination
329
- const calculatedTotal = useMemo(() => {
330
- // If totalSize is explicitly provided, use it for server-side pagination
331
- if (totalSize !== undefined && totalSize > 0)
332
- return totalSize;
333
- if (resolvedRemote)
334
- return data.length;
335
- return filterData(data, filters, columns, debouncedSearchValue).length;
336
- }, [
337
- data,
338
- filters,
339
- columns,
340
- debouncedSearchValue,
341
- resolvedRemote,
342
- totalSize,
343
- ]);
344
- // Handle search
345
- const handleSearchChange = useCallback((value) => {
346
- setInternalSearchValue(value);
347
- onSearch?.(value);
348
- // Enable debounced onFilter callback with 'search' type
349
- shouldCallOnFilter.current = true;
350
- filterTypeRef.current = 'search';
351
- onChange?.({ type: 'search', search: value });
352
- }, [onSearch, onChange]);
353
- // Handle sort
354
- const handleSortClick = useCallback((column) => {
355
- if (!column.sort)
356
- return;
357
- const newSort = handleSort(column.dataField, sort.order);
358
- onSortChange?.(newSort);
359
- onChange?.({ type: 'sort', sort: newSort });
360
- }, [sort, handleSort, onSortChange, onChange]);
361
- // Handle filter
362
- const handleFilterChange = useCallback((field, value) => {
363
- setFilter(field, value);
364
- const newFilters = { ...filters, [field]: value };
365
- onFilterChange?.(newFilters);
366
- // Enable debounced onFilter callback with 'filter' type
367
- shouldCallOnFilter.current = true;
368
- filterTypeRef.current = 'filter';
369
- onChange?.({ type: 'filter', filters: newFilters });
370
- }, [filters, setFilter, onFilterChange, onChange]);
371
- // Handle clear all filters
372
- const handleClearFilters = useCallback(() => {
373
- clearFilters();
374
- setInternalSearchValue('');
375
- onClearFilters?.();
376
- clearAllFilter?.();
377
- onFilterChange?.({});
378
- onChange?.({ type: 'filter', filters: {} });
379
- // Reset the tracking ref so subsequent filters can trigger onFilter
380
- lastOnFilterCallRef.current = null;
381
- }, [clearFilters, onClearFilters, onFilterChange, onChange]);
382
- // Handle page change
383
- const handlePageChange = useCallback((newPage) => {
384
- goToPage(newPage);
385
- // Pass 1-indexed page number to callbacks (user-friendly)
386
- const displayPage = newPage + 1;
387
- // onPageSizeChange is the primary callback
388
- onPageSizeChange?.(displayPage, pageSize);
389
- onPageChange?.(displayPage, pageSize);
390
- onChange?.({
391
- type: 'pagination',
392
- pagination: { page: displayPage, pageSize },
393
- });
394
- }, [goToPage, pageSize, onPageSizeChange, onPageChange, onChange]);
395
- // Handle page size change
396
- const handlePageSizeChange = useCallback((newSize) => {
397
- changePageSize(newSize);
398
- // Pass 1-indexed page number to callbacks (page 1 after size change)
399
- onPageSizeChange?.(1, newSize);
400
- onPageChange?.(1, newSize);
401
- onChange?.({
402
- type: 'pagination',
403
- pagination: { page: 1, pageSize: newSize },
404
- });
405
- }, [changePageSize, onPageSizeChange, onPageChange, onChange]);
406
- // Handle row click
407
- const handleRowClick = useCallback((row, rowIndex, e) => {
408
- // Selection handling - only for 'single' mode (checkbox mode uses checkbox click only)
409
- if (resolvedRowSelection?.mode === 'single') {
410
- const result = toggleRow(row);
411
- if (result) {
412
- resolvedRowSelection?.onChange?.(result.selectedKeys, result.selectedRows);
413
- }
414
- }
415
- // Expand by click
416
- if (expandable?.expandRowByClick) {
417
- const result = toggleExpand(row);
418
- if (result) {
419
- expandable.onExpandChange?.(result.expandedKeys, result.expanded, row);
420
- }
421
- }
422
- onRowClick?.(row, rowIndex, e);
423
- }, [rowSelection, expandable, toggleRow, toggleExpand, onRowClick]);
424
- // Helper to check if cell is editable and get custom editor
425
- const getCellEditableInfo = useCallback((column, row, rowIndex, colIndex) => {
426
- // If editorRenderer is provided, column is editable by default (unless editable explicitly returns false)
427
- const hasEditorRenderer = !!column.editorRenderer;
428
- if (column.editable === undefined) {
429
- // No editable prop - editable if has editorRenderer
430
- return { isEditable: hasEditorRenderer };
431
- }
432
- if (column.editable === false) {
433
- return { isEditable: false };
434
- }
435
- if (column.editable === true) {
436
- return { isEditable: true };
437
- }
438
- // It's a function
439
- const cellValue = getNestedValue(row, column.dataField);
440
- const result = column.editable(cellValue, row, rowIndex, colIndex);
441
- if (typeof result === 'boolean') {
442
- return { isEditable: result };
443
- }
444
- // Result is a custom editor (ReactNode)
445
- return { isEditable: true, customEditor: result };
446
- }, []);
447
- // Handle cell edit
448
- const handleCellDoubleClick = useCallback((row, rowIndex, column, colIndex, e) => {
449
- // Call column's onDoubleClick event if defined
450
- column.events?.onDoubleClick?.(e, row, rowIndex, column, colIndex);
451
- // Handle cell editing
452
- if (editMode !== 'none') {
453
- const { isEditable } = getCellEditableInfo(column, row, rowIndex, colIndex);
454
- if (isEditable && editMode === 'dblclick') {
455
- setEditingCell({ row: rowIndex, field: column.dataField });
456
- setEditValue(getNestedValue(row, column.dataField));
457
- }
458
- }
459
- // Call row double click callback
460
- onRowDoubleClick?.(row, rowIndex, e);
461
- }, [editMode, onRowDoubleClick, getCellEditableInfo]);
462
- const handleCellClick = useCallback((row, rowIndex, column, colIndex, e) => {
463
- // Call column's onClick event if defined
464
- if (e) {
465
- column.events?.onClick?.(e, row, rowIndex, column, colIndex);
466
- }
467
- // Handle cell editing on click
468
- if (editMode === 'click') {
469
- const { isEditable } = getCellEditableInfo(column, row, rowIndex, colIndex);
470
- if (isEditable) {
471
- setEditingCell({ row: rowIndex, field: column.dataField });
472
- setEditValue(getNestedValue(row, column.dataField));
473
- }
474
- }
475
- }, [editMode, getCellEditableInfo]);
476
- const handleCellEditComplete = useCallback((row, rowIndex, column) => {
477
- if (editingCell) {
478
- // Validate
479
- if (column.validator) {
480
- const result = column.validator(editValue, row);
481
- if (result !== true) {
482
- alert(typeof result === 'string' ? result : 'Invalid value');
483
- setEditingCell(null);
484
- return;
485
- }
486
- }
487
- const rowId = row[keyField];
488
- onCellEdit?.(editValue, column.dataField, row, rowIndex);
489
- onUpdateItem?.(editValue, column.dataField, rowId);
490
- }
491
- setEditingCell(null);
492
- }, [editingCell, editValue, onCellEdit, onUpdateItem, keyField]);
493
- // Helper to get nested value from object
494
- const getNestedValueLocal = (obj, path) => {
495
- return path.split('.').reduce((acc, key) => acc?.[key], obj);
496
- };
497
- // Process field value based on fieldTypeConfig (matching reference implementation)
498
- const processFieldValue = useCallback((value, dataField, row) => {
499
- const configOrType = fieldTypeConfig?.[dataField];
500
- // Handle both object config and string shorthand (e.g., 'boolean', 'date')
501
- const config = typeof configOrType === 'string'
502
- ? { type: configOrType }
503
- : configOrType;
504
- const fieldType = config?.type || 'string';
505
- switch (fieldType) {
506
- case 'array':
507
- if (config?.fields && config.fields.length > 0) {
508
- // Array of objects with specific fields to extract
509
- if (!Array.isArray(value))
510
- return value || '';
511
- return value
512
- .slice(0, config.maxItems || value.length)
513
- .map((item) => {
514
- if (typeof item === 'object' && config.fields) {
515
- // Extract only specified fields from the object
516
- return config.fields
517
- .map((field) => item[field])
518
- .filter(Boolean)
519
- .join(', ');
520
- }
521
- else if (typeof item === 'string') {
522
- return item;
523
- }
524
- return '';
525
- })
526
- .filter(Boolean)
527
- .join(config.separator || '; ');
528
- }
529
- else {
530
- // Default array handling
531
- if (!Array.isArray(value))
532
- return value || '';
533
- return value
534
- .map((item) => typeof item === 'object' ? JSON.stringify(item) : item)
535
- .join('; ');
536
- }
537
- case 'object':
538
- if (!value || typeof value !== 'object')
539
- return '';
540
- const fields = config?.fields || config?.keys || [];
541
- const labelMap = config?.labelMap || {};
542
- if (fields.length > 0) {
543
- // Extract specific fields with optional label mapping
544
- return fields
545
- .map((field) => {
546
- const nestedValue = getNestedValueLocal(value, field);
547
- if (nestedValue !== undefined && nestedValue !== null) {
548
- const label = labelMap[field] || field;
549
- return `${label}: ${nestedValue}`;
550
- }
551
- return null;
552
- })
553
- .filter(Boolean)
554
- .join(', ');
555
- }
556
- else {
557
- // Default object handling
558
- return Object.entries(value)
559
- .map(([key, val]) => typeof val === 'boolean'
560
- ? `${key}: ${val ? 'Yes' : 'No'}`
561
- : `${key}: ${val}`)
562
- .join(', ');
563
- }
564
- case 'date':
565
- if (!value)
566
- return '';
567
- try {
568
- const date = new Date(value);
569
- const format = config?.dateFormat || 'YYYY-MM-DD HH:mm:ss';
570
- // Simple date formatting
571
- return date.toISOString().slice(0, 19).replace('T', ' ');
572
- }
573
- catch {
574
- return String(value);
575
- }
576
- case 'number':
577
- return value !== undefined && value !== null
578
- ? String(Number(value))
579
- : '';
580
- case 'boolean':
581
- return typeof value === 'boolean' ? (value ? 'Yes' : 'No') : '';
582
- case 'string':
583
- case 'text':
584
- default:
585
- if (typeof value === 'boolean')
586
- return value ? 'Yes' : 'No';
587
- return value !== undefined && value !== null ? String(value) : '';
588
- }
589
- }, [fieldTypeConfig]);
590
- // Handle export
591
- const handleExport = useCallback(async () => {
592
- const exportData = resolvedRemote
593
- ? data
594
- : filterData(data, filters, columns, debouncedSearchValue);
595
- // Filter columns based on hideExcelSheet array and csvExport !== false
596
- let exportColumns = visibleColumns.filter((col) => col.csvExport !== false);
597
- if (Array.isArray(hideExcelSheet)) {
598
- exportColumns = exportColumns.filter((col) => !hideExcelSheet.includes(col.dataField));
599
- }
600
- // Also filter based on fieldTypeConfig hideFromExport or csvExport
601
- if (fieldTypeConfig) {
602
- exportColumns = exportColumns.filter((col) => {
603
- const configOrType = fieldTypeConfig[col.dataField];
604
- const config = typeof configOrType === 'string'
605
- ? { type: configOrType }
606
- : configOrType;
607
- if (config?.hideFromExport)
608
- return false;
609
- if (config?.csvExport === false)
610
- return false;
611
- return true;
612
- });
613
- }
614
- // Create enhanced columns with export formatters
615
- const enhancedColumns = exportColumns.map((col) => {
616
- const configOrType = fieldTypeConfig?.[col.dataField];
617
- const config = typeof configOrType === 'string'
618
- ? { type: configOrType }
619
- : configOrType;
620
- // If column already has csvFormatter, use it
621
- if (col.csvFormatter) {
622
- return col;
623
- }
624
- // If config has exportFormatter, use it
625
- if (config?.exportFormatter) {
626
- return { ...col, csvFormatter: config.exportFormatter };
627
- }
628
- // If config has type, create formatter based on type
629
- if (config?.type) {
630
- return {
631
- ...col,
632
- csvFormatter: (cell, row) => processFieldValue(cell, col.dataField, row),
633
- };
634
- }
635
- return col;
636
- });
637
- // Export based on format
638
- if (exportFormat === 'excel') {
639
- await exportToExcel(exportData, enhancedColumns, resolvedExportFileName);
640
- }
641
- else {
642
- exportToCSV(exportData, enhancedColumns, resolvedExportFileName);
643
- }
644
- }, [
645
- data,
646
- filters,
647
- columns,
648
- debouncedSearchValue,
649
- visibleColumns,
650
- hideExcelSheet,
651
- fieldTypeConfig,
652
- processFieldValue,
653
- resolvedExportFileName,
654
- resolvedRemote,
655
- exportFormat,
656
- ]);
657
- // Handle checkbox change
658
- const handleCheckboxChange = useCallback((row, e) => {
659
- e.stopPropagation();
660
- const result = toggleRow(row);
661
- if (result) {
662
- resolvedRowSelection?.onChange?.(result.selectedKeys, result.selectedRows);
663
- }
664
- }, [toggleRow, rowSelection]);
665
- // Handle select all
666
- const handleSelectAllChange = useCallback(() => {
667
- const result = toggleAll(!isAllSelected);
668
- if (result) {
669
- resolvedRowSelection?.onChange?.(result.selectedKeys, result.selectedRows);
670
- }
671
- }, [toggleAll, isAllSelected, resolvedRowSelection]);
672
- // Handle expand toggle
673
- const handleExpandClick = useCallback((row, e) => {
674
- e.stopPropagation();
675
- const result = toggleExpand(row);
676
- expandable?.onExpandChange?.(result.expandedKeys, result.expanded, row);
677
- }, [toggleExpand, expandable]);
678
- // Filtered column list for toggle panel
679
- const filteredToggleColumns = useMemo(() => {
680
- return columns.filter((c) => c.dataField !== keyField &&
681
- c.text.toLowerCase().includes(columnSearch.toLowerCase()));
682
- }, [columns, keyField, columnSearch]);
683
- // Get row key
684
- const getRowKey = useCallback((row) => row[keyField], [keyField]);
685
- // Render cell content
686
- const renderCellContent = useCallback((row, column, rowIndex, colIndex) => {
687
- const value = getNestedValue(row, column.dataField);
688
- const isEditing = editingCell?.row === rowIndex &&
689
- editingCell?.field === column.dataField;
690
- if (isEditing) {
691
- // Check for custom editorRenderer
692
- if (column.editorRenderer) {
693
- const rowId = row[keyField];
694
- const editorProps = {
695
- value: editValue,
696
- onUpdate: (newValue) => {
697
- setEditValue(newValue);
698
- // Call onUpdateItem directly for custom editors
699
- onUpdateItem?.(newValue, column.dataField, rowId);
700
- setEditingCell(null);
701
- },
702
- onCancel: () => setEditingCell(null),
703
- onBlur: () => {
704
- // Only complete if value changed
705
- if (editValue !== value) {
706
- onUpdateItem?.(editValue, column.dataField, rowId);
707
- }
708
- setEditingCell(null);
709
- },
710
- row,
711
- column,
712
- rowIndex,
713
- columnIndex: colIndex,
714
- // Additional helpers for direct update
715
- rowId,
716
- dataField: column.dataField,
717
- onUpdateItem: (newValue) => {
718
- onUpdateItem?.(newValue, column.dataField, rowId);
719
- setEditingCell(null);
720
- },
721
- };
722
- return column.editorRenderer(editorProps, editValue, row, column, rowIndex, colIndex);
723
- }
724
- // Default editor
725
- return (_jsx(CellEditor, { type: column.editorType === 'number' ? 'number' : 'text', value: editValue ?? '', onChange: (e) => setEditValue(e.target.value), onBlur: () => handleCellEditComplete(row, rowIndex, column), onKeyDown: (e) => {
726
- if (e.key === 'Enter') {
727
- handleCellEditComplete(row, rowIndex, column);
728
- }
729
- if (e.key === 'Escape') {
730
- setEditingCell(null);
731
- }
732
- }, className: column.editorClasses, style: column.editorStyle, autoFocus: true }));
733
- }
734
- if (column.formatter) {
735
- return column.formatter(value, row, rowIndex, colIndex);
736
- }
737
- if (value === null || value === undefined)
738
- return '';
739
- if (typeof value === 'boolean')
740
- return value ? 'Yes' : 'No';
741
- if (typeof value === 'object')
742
- return JSON.stringify(value);
743
- return String(value);
744
- }, [editingCell, editValue, handleCellEditComplete]);
745
- // Render toolbar
746
- const renderToolbar = () => {
747
- if (hideToolbar)
748
- return null;
749
- if (typeof toolbar === 'function') {
750
- return toolbar({
751
- searchValue,
752
- onSearch: handleSearchChange,
753
- onClearFilters: handleClearFilters,
754
- onExport: handleExport,
755
- });
756
- }
757
- if (toolbar)
758
- return toolbar;
759
- const hasFilters = Object.keys(filters).length > 0 || searchValue;
760
- return (_jsxs(Toolbar, { className: classNames.toolbar, style: styles.toolbar, children: [_jsxs(ToolbarGroup, { children: [toolbarLeft, searchable && (_jsxs(SearchInput, { children: [_jsx(SearchIcon, {}), _jsx("input", { type: "text", value: searchValue, onChange: (e) => handleSearchChange(e.target.value), onFocus: () => {
761
- // Clear column filter focus when global search is focused
762
- focusedFilterFieldRef.current = null;
763
- }, placeholder: searchPlaceholder })] })), searchable && (_jsx(ToolbarButton, { onClick: () => handleSearchChange(''), disabled: !searchValue, style: { opacity: searchValue ? 1 : 0.6 }, children: "Clear" })), _jsx(ToolbarButton, { onClick: handleClearFilters, disabled: !hasFilters, style: { opacity: hasFilters ? 1 : 0.6 }, children: "Clear all filters" }), resolvedExportable && hideExcelSheet !== true && (_jsxs(ToolbarButton, { onClick: handleExport, children: [_jsx(DownloadIcon, {}), exportFormat === 'excel' ? 'Export Excel' : 'Export CSV'] })), showFilterToggle && (_jsxs("div", { ref: columnToggleRef, style: { position: 'relative' }, children: [_jsx(Tooltip, { content: "Show/Hide Columns", position: "bottom", children: _jsx(ToolbarButton, { "$active": columnToggleOpen, onClick: () => setColumnToggleOpen(!columnToggleOpen), "aria-label": "Toggle column visibility", style: { padding: '0 8px' }, children: _jsx(FilterIcon, {}) }) }), columnToggleOpen && (_jsxs(ColumnTogglePanel, { children: [_jsxs(ColumnToggleHeader, { children: [_jsx("span", { children: "Show/Hide Columns" }), _jsx("button", { onClick: () => setColumnToggleOpen(false), children: _jsx(CloseIcon, {}) })] }), _jsx(ColumnToggleSearch, { children: _jsx("input", { type: "text", value: columnSearch, onChange: (e) => setColumnSearch(e.target.value), placeholder: "Search columns..." }) }), _jsxs(ColumnToggleList, { children: [_jsxs(ColumnToggleItem, { style: {
764
- borderBottom: '1px solid #e5e7eb',
765
- paddingBottom: 8,
766
- marginBottom: 4,
767
- }, children: [_jsx("input", { type: "checkbox", checked: filteredToggleColumns.length > 0 &&
768
- filteredToggleColumns.every((col) => !isColumnHidden(col.dataField)), onChange: (e) => {
769
- filteredToggleColumns.forEach((col) => {
770
- if (e.target.checked) {
771
- if (isColumnHidden(col.dataField)) {
772
- toggleColumn(col.dataField);
773
- }
774
- }
775
- else {
776
- if (!isColumnHidden(col.dataField)) {
777
- toggleColumn(col.dataField);
778
- }
779
- }
780
- });
781
- } }), _jsx("span", { style: { fontWeight: 600 }, children: "Select All" })] }), filteredToggleColumns.map((column) => (_jsxs(ColumnToggleItem, { children: [_jsx("input", { type: "checkbox", checked: !isColumnHidden(column.dataField), onChange: () => toggleColumn(column.dataField) }), _jsx("span", { children: column.text })] }, column.dataField)))] })] }))] }))] }), toolbarCenter, _jsxs(ToolbarGroup, { children: [refreshable && (_jsxs(ToolbarButton, { onClick: onRefresh, children: [_jsx(RefreshIcon, {}), "Refresh"] })), printable && (_jsxs(ToolbarButton, { onClick: onPrint, children: [_jsx(PrintIcon, {}), "Print"] })), columnToggle && (_jsxs("div", { ref: !showFilterToggle ? columnToggleRef : undefined, style: { position: 'relative' }, children: [_jsxs(ToolbarButton, { "$active": columnToggleOpen, onClick: () => setColumnToggleOpen(!columnToggleOpen), children: [_jsx(ColumnsIcon, {}), "Columns"] }), columnToggleOpen && (_jsxs(ColumnTogglePanel, { children: [_jsxs(ColumnToggleHeader, { children: [_jsx("span", { children: "Toggle Columns" }), _jsx("button", { onClick: () => setColumnToggleOpen(false), children: _jsx(CloseIcon, {}) })] }), _jsx(ColumnToggleSearch, { children: _jsx("input", { type: "text", value: columnSearch, onChange: (e) => setColumnSearch(e.target.value), placeholder: "Search columns..." }) }), _jsx(ColumnToggleList, { children: filteredToggleColumns.map((column) => (_jsxs(ColumnToggleItem, { children: [_jsx("input", { type: "checkbox", checked: !isColumnHidden(column.dataField), onChange: () => toggleColumn(column.dataField) }), _jsx("span", { children: column.text })] }, column.dataField))) })] }))] })), toolbarRight] })] }));
782
- };
783
- // Render pagination
784
- const renderPagination = () => {
785
- if (!pagination)
786
- return null;
787
- const actualTotalPages = Math.ceil(calculatedTotal / pageSize) || 1;
788
- const startItem = calculatedTotal > 0 ? page * pageSize + 1 : 0;
789
- // Use actual data length for endItem to show correct count
790
- const actualDataCount = resolvedRemote
791
- ? data.length
792
- : processedData.length;
793
- const endItem = Math.min(page * pageSize + actualDataCount, calculatedTotal);
794
- const showTotal = resolvedPaginationConfig?.showTotal === true
795
- ? `Showing ${startItem} to ${endItem} of ${calculatedTotal} Results`
796
- : typeof resolvedPaginationConfig?.showTotal === 'function'
797
- ? resolvedPaginationConfig.showTotal(calculatedTotal, [
798
- startItem,
799
- endItem,
800
- ])
801
- : null;
802
- // Generate page numbers
803
- const getPageNumbers = () => {
804
- const pages = [];
805
- const maxVisible = 5;
806
- if (actualTotalPages <= maxVisible) {
807
- for (let i = 0; i < actualTotalPages; i++)
808
- pages.push(i);
809
- }
810
- else {
811
- if (page < 3) {
812
- for (let i = 0; i < 4; i++)
813
- pages.push(i);
814
- pages.push('...');
815
- pages.push(actualTotalPages - 1);
816
- }
817
- else if (page > actualTotalPages - 4) {
818
- pages.push(0);
819
- pages.push('...');
820
- for (let i = actualTotalPages - 4; i < actualTotalPages; i++)
821
- pages.push(i);
822
- }
823
- else {
824
- pages.push(0);
825
- pages.push('...');
826
- for (let i = page - 1; i <= page + 1; i++)
827
- pages.push(i);
828
- pages.push('...');
829
- pages.push(actualTotalPages - 1);
830
- }
831
- }
832
- return pages;
833
- };
834
- return (_jsxs(PaginationWrapper, { className: classNames.pagination, style: styles.pagination, children: [_jsxs(ToolbarGroup, { children: [(resolvedRowSelection?.mode === 'checkbox' || isSelectRow) &&
835
- selectedKeys.size > 0 && (_jsxs(SelectionIndicator, { onClick: () => {
836
- const selectedRows = data.filter((row) => selectedKeys.has(getRowKey(row)));
837
- resolvedRowSelection?.onChange?.(Array.from(selectedKeys), selectedRows);
838
- // Call onSelectedRow only when user clicks this button
839
- onSelectedRow?.(selectedRows);
840
- }, children: [_jsx(SelectionCount, { "$animate": selectionAnimation, children: selectedKeys.size }, selectedKeys.size), _jsx("span", { children: "Selected" })] })), resolvedPaginationConfig?.showSizeChanger !== false && (_jsx(PageSizeSelect, { value: pageSize, onChange: (e) => handlePageSizeChange(Number(e.target.value)), children: (resolvedPaginationConfig?.pageSizeOptions || [10, 20, 30, 50]).map((size) => (_jsx("option", { value: size, children: size }, size))) }))] }), _jsxs(PaginationControls, { children: [_jsx(PageButton, { onClick: () => handlePageChange(0), disabled: page === 0, children: _jsx(ChevronsLeftIcon, {}) }), _jsx(PageButton, { onClick: () => handlePageChange(page - 1), disabled: page === 0, children: _jsx(ChevronLeftIcon, {}) }), getPageNumbers().map((p, i) => typeof p === 'string' ? (_jsx("span", { style: { padding: '0 4px', color: 'white' }, children: p }, `ellipsis-${i}`)) : (_jsx(PageButton, { "$active": p === page, onClick: () => handlePageChange(p), children: p + 1 }, p))), _jsx(PageButton, { onClick: () => handlePageChange(page + 1), disabled: page >= actualTotalPages - 1, children: _jsx(ChevronRightIcon, {}) }), _jsx(PageButton, { onClick: () => handlePageChange(actualTotalPages - 1), disabled: page >= actualTotalPages - 1, children: _jsx(ChevronsRightIcon, {}) })] }), showTotal && _jsx(PaginationInfo, { children: showTotal }), resolvedPaginationConfig?.showQuickJumper &&
841
- (() => {
842
- const handleQuickJump = (input) => {
843
- const pageNum = parseInt(input.value, 10);
844
- if (!isNaN(pageNum) &&
845
- pageNum >= 1 &&
846
- pageNum <= actualTotalPages) {
847
- handlePageChange(pageNum - 1); // Convert to 0-indexed
848
- input.value = '';
849
- return true;
850
- }
851
- return false;
852
- };
853
- return (_jsxs(QuickJumper, { children: ["Go to", _jsx("input", { type: "number", min: 1, max: actualTotalPages, placeholder: `1-${actualTotalPages}`, onKeyDown: (e) => {
854
- if (e.key === 'Enter') {
855
- e.preventDefault();
856
- const target = e.target;
857
- if (handleQuickJump(target)) {
858
- target.blur();
859
- }
860
- }
861
- }, onBlur: (e) => {
862
- const target = e.target;
863
- handleQuickJump(target);
864
- } }), _jsx(PageButton, { onClick: () => {
865
- const input = document.querySelector(`#${id} input[type="number"]`);
866
- if (input) {
867
- handleQuickJump(input);
868
- input.blur();
869
- }
870
- }, style: { marginLeft: '4px', padding: '2px 8px' }, children: "Go" })] }));
871
- })()] }));
872
- };
873
- // Check if any columns have filters
874
- const hasFilterableColumns = filterable ||
875
- columns.some((c) => typeof c.filter === 'function' ||
876
- c.filterComponent ||
877
- c.filter === true);
878
- // Should show filter row - check if there are filterable columns AND filters are visible
879
- const shouldShowFilterRow = hasFilterableColumns && showFilterRow;
880
- return (_jsxs(TableRoot, { ref: (node) => {
881
- // Handle forwarded ref
882
- if (typeof ref === 'function') {
883
- ref(node);
884
- }
885
- else if (ref) {
886
- ref.current = node;
887
- }
888
- // Also store in our container ref
889
- tableContainerRef.current = node;
890
- }, "$bordered": bordered, "$compact": compact, className: className || classNames.root, style: { ...styles.root, ...style, position: 'relative' }, "aria-label": rest['aria-label'], "aria-labelledby": rest['aria-labelledby'], children: [loading && (_jsx(LoadingOverlay, { className: classNames.loading, style: styles.loading, children: loadingIndicator || _jsx(LoadingSpinner, {}) })), renderToolbar(), _jsx(TableWrapper, { "$maxHeight": maxHeight, "$stickyHeader": stickyHeader, className: classNames.wrapper, style: styles.wrapper, children: _jsxs(StyledTable, { ref: tableRef, "$striped": striped, "$hover": hover, "$compact": compact, role: "grid", children: [caption && _jsx("caption", { className: "sr-only", children: caption }), _jsx(TableHeader, { "$sticky": stickyHeader, className: classNames.header, style: styles.header, children: _jsxs(HeaderRow, { className: classNames.headerRow, style: styles.headerRow, children: [resolvedRowSelection?.mode === 'checkbox' && (_jsx(HeaderCell, { "$align": "center", "$sortable": false, "$compact": compact, "$width": resolvedRowSelection.columnWidth || 40, children: !resolvedRowSelection.hideSelectAll && (_jsx(Checkbox, { checked: isAllSelected, ref: (el) => {
891
- if (el)
892
- el.indeterminate = isIndeterminate;
893
- }, onChange: handleSelectAllChange })) })), expandable && (_jsx(HeaderCell, { "$align": "center", "$sortable": false, "$compact": compact, "$width": expandable.columnWidth || 40 })), showRowNumber && (_jsx(HeaderCell, { "$align": "center", "$sortable": false, "$compact": compact, "$width": rowNumberWidth, children: rowNumberTitle })), visibleColumns.map((column, colIndex) => {
894
- // Determine if column has a filter
895
- const hasColumnFilter = typeof column.filter === 'function' ||
896
- column.filter === true ||
897
- column.filterComponent ||
898
- column.filterRenderer;
899
- // Get the filter component
900
- const FilterComponent = hasColumnFilter
901
- ? (typeof column.filter === 'function'
902
- ? column.filter
903
- : null) ||
904
- column.filterComponent ||
905
- getFilterComponent(column.filterType || 'text')
906
- : null;
907
- const onFilter = (value) => handleFilterChange(column.dataField, value);
908
- return (_jsx(HeaderCell, { "$align": column.headerAlign || column.align || 'left', "$sortable": !!column.sort, "$compact": compact, "$width": column.width, "$minWidth": column.minWidth, "$pinned": column.pinned, "$customClass": !!column.headerClasses, className: [column.headerClasses, classNames.headerCell]
909
- .filter(Boolean)
910
- .join(' '), style: typeof column.headerStyle === 'function'
911
- ? column.headerStyle(column)
912
- : column.headerStyle || styles.headerCell, role: "columnheader", "aria-sort": sort.field === column.dataField
913
- ? sort.order === 'asc'
914
- ? 'ascending'
915
- : sort.order === 'desc'
916
- ? 'descending'
917
- : 'none'
918
- : undefined, children: (() => {
919
- // Check visibility props (default to true if not specified)
920
- const headerStyleObj = typeof column.headerStyle === 'function'
921
- ? column.headerStyle(column)
922
- : column.headerStyle;
923
- // isHeaderTitle: show title (default true, false to hide)
924
- const showTitle = column.isHeaderTitle !== false &&
925
- column.hideHeaderText !== true &&
926
- !(headerStyleObj && headerStyleObj.fontSize === 0);
927
- // isHeaderFilterComp: show filter (default true)
928
- const showFilter = column.isHeaderFilterComp !== false &&
929
- shouldShowFilterRow &&
930
- hasColumnFilter &&
931
- FilterComponent;
932
- // isHeaderSort: show sort icon (default true)
933
- const showSort = column.isHeaderSort !== false && column.sort;
934
- // If no filter, show title and sort on single line
935
- if (!showFilter) {
936
- return (_jsxs("div", { style: {
937
- display: 'flex',
938
- alignItems: 'center',
939
- justifyContent: column.headerAlign || column.align || 'left',
940
- gap: 6,
941
- width: '100%',
942
- cursor: showSort ? 'pointer' : 'default',
943
- }, onClick: () => showSort && handleSortClick(column), children: [showTitle && (_jsx("span", { style: {
944
- color: 'white',
945
- fontWeight: 600,
946
- fontSize: 12,
947
- whiteSpace: 'nowrap',
948
- }, children: column.headerFormatter
949
- ? column.headerFormatter(column, colIndex)
950
- : column.headerText || column.text })), showSort && (_jsx("div", { style: {
951
- display: 'flex',
952
- alignItems: 'center',
953
- justifyContent: 'center',
954
- flexShrink: 0,
955
- }, children: column.sortCaret ? (column.sortCaret(sort.field === column.dataField
956
- ? sort.order
957
- : null, column)) : (_jsx(DefaultSortCaret, { order: sort.field === column.dataField
958
- ? sort.order
959
- : null, column: column })) }))] }));
960
- }
961
- // With filter: two-row layout
962
- return (_jsxs("div", { style: {
963
- display: 'flex',
964
- flexDirection: 'column',
965
- gap: 4,
966
- width: '100%',
967
- }, children: [showTitle && (_jsx("span", { style: {
968
- color: 'white',
969
- fontWeight: 600,
970
- fontSize: 12,
971
- whiteSpace: 'nowrap',
972
- cursor: showSort ? 'pointer' : 'default',
973
- }, onClick: () => showSort && handleSortClick(column), children: column.headerFormatter
974
- ? column.headerFormatter(column, colIndex)
975
- : column.headerText || column.text })), _jsxs("div", { style: {
976
- display: 'flex',
977
- alignItems: 'center',
978
- justifyContent: 'center',
979
- gap: 6,
980
- width: '100%',
981
- minHeight: 24,
982
- }, children: [_jsx("div", { style: {
983
- width: showSort ? '80%' : '100%',
984
- minWidth: 0,
985
- flexShrink: 1,
986
- display: 'flex',
987
- alignItems: 'center',
988
- }, onClick: (e) => e.stopPropagation(), children: column.filterRenderer ? (column.filterRenderer(onFilter, column)) : (_jsx("div", { onFocusCapture: () => {
989
- focusedFilterFieldRef.current =
990
- column.dataField;
991
- }, "data-filter-wrapper": column.dataField, children: _jsx(FilterComponent, { column: column, value: filters[column.dataField], onChange: onFilter, onClear: () => handleFilterChange(column.dataField, null) }, `filter-${column.dataField}`) })) }), showSort && (_jsx("div", { style: {
992
- width: '20%',
993
- minWidth: 24,
994
- height: 24,
995
- display: 'flex',
996
- alignItems: 'center',
997
- justifyContent: 'center',
998
- flexShrink: 0,
999
- cursor: 'pointer',
1000
- }, onClick: () => handleSortClick(column), children: column.sortCaret ? (column.sortCaret(sort.field === column.dataField
1001
- ? sort.order
1002
- : null, column)) : (_jsx(DefaultSortCaret, { order: sort.field === column.dataField
1003
- ? sort.order
1004
- : null, column: column })) }))] })] }));
1005
- })() }, column.dataField));
1006
- })] }) }), _jsx(TableBody, { className: classNames.body, style: styles.body, children: processedData.length === 0 ? (_jsx("tr", { children: _jsx("td", { colSpan: visibleColumns.length +
1007
- (resolvedRowSelection?.mode === 'checkbox' ? 1 : 0) +
1008
- (expandable ? 1 : 0) +
1009
- (showRowNumber ? 1 : 0), children: _jsxs(EmptyState, { className: classNames.empty, style: styles.empty, children: [_jsx(EmptyIcon, {}), _jsx("span", { children: emptyText })] }) }) })) : (processedData.map((row, rowIndex) => {
1010
- const rowKey = getRowKey(row);
1011
- const rowSelected = isSelected(rowKey);
1012
- const rowExpanded = isExpanded(rowKey);
1013
- const checkboxProps = resolvedRowSelection?.getCheckboxProps?.(row);
1014
- const isExpandable = expandable?.rowExpandable?.(row) ?? true;
1015
- const rowClass = typeof rowClassName === 'function'
1016
- ? rowClassName(row, rowIndex)
1017
- : rowClassName;
1018
- const rowStyles = typeof rowStyle === 'function'
1019
- ? rowStyle(row, rowIndex)
1020
- : rowStyle;
1021
- const selectedStyle = rowSelected
1022
- ? typeof resolvedRowSelection?.selectedRowStyle ===
1023
- 'function'
1024
- ? resolvedRowSelection.selectedRowStyle(row)
1025
- : resolvedRowSelection?.selectedRowStyle
1026
- : undefined;
1027
- // Check if custom selected style has a background color
1028
- const hasCustomBgColor = rowSelected &&
1029
- selectedStyle &&
1030
- (selectedStyle.backgroundColor || selectedStyle.background);
1031
- // Apply non-selectable style if row is disabled
1032
- const disabledStyle = checkboxProps?.disabled
1033
- ? nonSelectableStyle || {
1034
- backgroundColor: '#f3f4f6',
1035
- opacity: 0.7,
1036
- }
1037
- : undefined;
1038
- return (_jsxs(React.Fragment, { children: [_jsxs(TableRow, { "$selected": rowSelected, "$clickable": !!onRowClick ||
1039
- resolvedRowSelection?.mode === 'single' ||
1040
- expandable?.expandRowByClick === true, "$disabled": !!checkboxProps?.disabled, "$hasCustomSelectedStyle": !!hasCustomBgColor, "data-custom-selected": hasCustomBgColor ? 'true' : undefined, className: `${classNames.row || ''} ${rowClass || ''} ${rowSelected
1041
- ? typeof resolvedRowSelection?.selectedRowClassName ===
1042
- 'function'
1043
- ? resolvedRowSelection.selectedRowClassName(row)
1044
- : resolvedRowSelection?.selectedRowClassName || ''
1045
- : ''}`, style: {
1046
- ...styles.row,
1047
- ...rowStyles,
1048
- ...selectedStyle,
1049
- ...disabledStyle,
1050
- }, onClick: (e) => handleRowClick(row, rowIndex, e), onDoubleClick: (e) => {
1051
- // Only trigger row-level double click if not handled by a cell
1052
- // Cells handle their own double-clicks for editing
1053
- onRowDoubleClick?.(row, rowIndex, e);
1054
- }, role: "row", "aria-selected": rowSelected, children: [resolvedRowSelection?.mode === 'checkbox' && (_jsx(TableCell, { "$align": "center", "$compact": compact, "$padding": cellPadding, children: _jsx(Checkbox, { checked: rowSelected, disabled: checkboxProps?.disabled, onChange: (e) => handleCheckboxChange(row, e), onClick: (e) => e.stopPropagation() }) })), expandable && (_jsx(TableCell, { "$align": "center", "$compact": compact, "$padding": cellPadding, children: isExpandable && (_jsx(ExpandButton, { "$expanded": rowExpanded, onClick: (e) => handleExpandClick(row, e), children: expandable.expandIcon ? (expandable.expandIcon({
1055
- expanded: rowExpanded,
1056
- row,
1057
- onExpand: () => toggleExpand(row),
1058
- })) : (_jsx(ExpandIcon, {})) })) })), showRowNumber && (_jsx(TableCell, { "$align": "center", "$compact": compact, "$padding": cellPadding, style: {
1059
- width: rowNumberWidth,
1060
- color: '#6b7280',
1061
- fontWeight: 500,
1062
- }, children: rowNumberRender
1063
- ? rowNumberRender(rowIndex + 1, row)
1064
- : rowIndex + 1 + page * pageSize })), visibleColumns.map((column, colIndex) => {
1065
- const cellClass = typeof column.classes === 'function'
1066
- ? column.classes(getNestedValue(row, column.dataField), row, rowIndex, colIndex)
1067
- : column.classes;
1068
- const cellStyle = typeof column.style === 'function'
1069
- ? column.style(getNestedValue(row, column.dataField), row, rowIndex, colIndex)
1070
- : column.style;
1071
- return (_jsx(TableCell, { "$align": column.align || 'left', "$compact": compact, "$padding": cellPadding, "$pinned": column.pinned, "$hasCustomClass": !!cellClass, className: cellClass || classNames.cell, style: { ...styles.cell, ...cellStyle }, onClick: (e) => handleCellClick(row, rowIndex, column, colIndex, e), onDoubleClick: (e) => {
1072
- e.stopPropagation(); // Prevent row-level double-click from interfering
1073
- handleCellDoubleClick(row, rowIndex, column, colIndex, e);
1074
- }, role: "gridcell", children: (() => {
1075
- const editInfo = getCellEditableInfo(column, row, rowIndex, colIndex);
1076
- if (editInfo.isEditable &&
1077
- editMode !== 'none') {
1078
- // Check for custom editor
1079
- if (editInfo.customEditor) {
1080
- return editInfo.customEditor;
1081
- }
1082
- return (_jsx(EditableCell, { "$editing": editingCell?.row === rowIndex &&
1083
- editingCell?.field === column.dataField, "$showEditIcon": showEditIcon, children: renderCellContent(row, column, rowIndex, colIndex) }));
1084
- }
1085
- return renderCellContent(row, column, rowIndex, colIndex);
1086
- })() }, column.dataField));
1087
- })] }), expandable && rowExpanded && isExpandable && (_jsx(ExpandedRow, { children: _jsx(ExpandedCell, { colSpan: visibleColumns.length +
1088
- (resolvedRowSelection?.mode === 'checkbox'
1089
- ? 1
1090
- : 0) +
1091
- (expandable ? 1 : 0) +
1092
- (showRowNumber ? 1 : 0), children: expandable.expandedRowRender?.(row, rowIndex, rowExpanded) }) }))] }, rowKey));
1093
- })) }), showFooter && (_jsx(TableFooter, { className: classNames.footer, style: styles.footer, children: _jsxs(FooterRow, { className: classNames.footerRow, style: styles.footerRow, children: [resolvedRowSelection?.mode === 'checkbox' && (_jsx(FooterCell, { "$align": "center", "$compact": compact })), expandable && (_jsx(FooterCell, { "$align": "center", "$compact": compact })), showRowNumber && (_jsx(FooterCell, { "$align": "center", "$compact": compact })), visibleColumns.map((column) => (_jsx(FooterCell, { "$align": column.align || 'left', "$compact": compact, className: classNames.footerCell, style: styles.footerCell, children: typeof column.footer === 'function'
1094
- ? column.footer(column, data)
1095
- : column.footerFormatter
1096
- ? column.footerFormatter(column, data)
1097
- : column.footer }, column.dataField)))] }) }))] }) }), renderPagination()] }));
1098
- });
1099
- Table.displayName = 'Table';
1100
- export default Table;
1
+ "use strict";"use client";import{jsx as t,jsxs as s}from"react/jsx-runtime";import Yn,{forwardRef as Un,useState as O,useCallback as u,useMemo as me,useEffect as _,useRef as $}from"react";import{TableRoot as Qn,Toolbar as _n,ToolbarGroup as Ie,SearchInput as qn,ToolbarButton as K,TableWrapper as Gn,StyledTable as Xn,TableHeader as Zn,HeaderRow as er,HeaderCell as we,TableBody as tr,TableRow as nr,TableCell as ve,Checkbox as Et,ExpandButton as rr,ExpandedRow as or,ExpandedCell as ir,TableFooter as lr,FooterRow as ar,FooterCell as Re,PaginationWrapper as sr,PaginationInfo as dr,PaginationControls as cr,PageButton as q,PageSizeSelect as hr,QuickJumper as fr,EmptyState as pr,LoadingOverlay as ur,LoadingSpinner as gr,EditableCell as Cr,CellEditor as yr,ColumnTogglePanel as Tt,ColumnToggleHeader as Nt,ColumnToggleSearch as Lt,ColumnToggleList as Mt,ColumnToggleItem as Je,SelectionIndicator as br,SelectionCount as kr}from"./elements";import{useSortState as Sr,useFilterState as Fr,usePaginationState as xr,useRowSelection as mr,useRowExpansion as wr,useColumnVisibility as vr,useTableDebounce as Rr,sortData as $r,filterData as Ye,paginateData as Er,getNestedValue as G,exportToCSV as Tr,exportToExcel as Nr}from"./hooks";import{getFilterComponent as Lr}from"./filters";import{Tooltip as Mr}from"../Tooltip";const Pr=()=>s("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[t("circle",{cx:"11",cy:"11",r:"8"}),t("path",{d:"M21 21l-4.35-4.35",strokeLinecap:"round"})]}),jr=({size:M=14})=>t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round",style:{width:M,height:M},children:t("path",{d:"M12 19V5M5 12l7-7 7 7"})}),Br=({size:M=14})=>t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round",style:{width:M,height:M},children:t("path",{d:"M12 5v14M5 12l7 7 7-7"})}),Lo=()=>t("svg",{viewBox:"0 0 10 10",fill:"currentColor",children:t("path",{d:"M5 0L10 6H0L5 0z"})}),Mo=()=>t("svg",{viewBox:"0 0 10 10",fill:"currentColor",children:t("path",{d:"M5 10L0 4h10L5 10z"})}),Pt=({order:M})=>{const $e=()=>{switch(M){case"asc":return{up:16,down:10};case"desc":return{up:10,down:16};default:return{up:14,down:14}}},{up:I,down:de}=$e();return s("div",{style:{display:"flex",flexDirection:"row",alignItems:"center",justifyContent:"center",gap:2,color:"white"},children:[t(jr,{size:I}),t(Br,{size:de})]})},Wr=()=>t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:t("path",{d:"M15 18l-6-6 6-6",strokeLinecap:"round",strokeLinejoin:"round"})}),Dr=()=>t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:t("path",{d:"M9 18l6-6-6-6",strokeLinecap:"round",strokeLinejoin:"round"})}),Vr=()=>t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:t("path",{d:"M11 17l-5-5 5-5M18 17l-5-5 5-5",strokeLinecap:"round",strokeLinejoin:"round"})}),zr=()=>t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:t("path",{d:"M13 7l5 5-5 5M6 7l5 5-5 5",strokeLinecap:"round",strokeLinejoin:"round"})}),Hr=()=>t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:t("path",{d:"M9 18l6-6-6-6",strokeLinecap:"round",strokeLinejoin:"round"})}),jt=()=>t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:t("path",{d:"M18 6L6 18M6 6l12 12",strokeLinecap:"round",strokeLinejoin:"round"})}),Ar=()=>t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:t("path",{d:"M22 3H2l8 9.46V19l4 2v-8.54L22 3z",strokeLinecap:"round",strokeLinejoin:"round"})}),Or=()=>t("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:t("path",{d:"M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4M7 10l5 5 5-5M12 15V3",strokeLinecap:"round",strokeLinejoin:"round"})}),Kr=()=>s("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[t("rect",{x:"3",y:"3",width:"7",height:"18",rx:"1"}),t("rect",{x:"14",y:"3",width:"7",height:"18",rx:"1"})]}),Ir=()=>s("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",children:[t("rect",{x:"3",y:"3",width:"18",height:"18",rx:"2"}),t("path",{d:"M3 9h18M9 3v18",strokeLinecap:"round"})]}),Jr=()=>s("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[t("path",{d:"M23 4v6h-6M1 20v-6h6",strokeLinecap:"round",strokeLinejoin:"round"}),t("path",{d:"M3.51 9a9 9 0 0114.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0020.49 15",strokeLinecap:"round",strokeLinejoin:"round"})]}),Yr=()=>s("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[t("path",{d:"M6 9V2h12v7M6 18H4a2 2 0 01-2-2v-5a2 2 0 012-2h16a2 2 0 012 2v5a2 2 0 01-2 2h-2",strokeLinecap:"round",strokeLinejoin:"round"}),t("rect",{x:"6",y:"14",width:"12",height:"8"})]}),Po=()=>s("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[t("circle",{cx:"12",cy:"12",r:"10"}),t("path",{d:"M12 8v4M12 16h.01",strokeLinecap:"round",strokeLinejoin:"round"})]});export const Table=Un(function($e,I){const{id:de,data:g,columns:R,keyField:E="_id",loading:Bt=!1,loadingIndicator:Wt,pagination:ce=!0,paginationConfig:Ue,totalSize:N,remote:Qe=!0,defaultSort:Dt,sort:Vt,filterable:zt=!1,defaultFilters:Ht,filters:At,defaultShowFilters:Ot=!0,showFilters:_e,onShowFiltersChange:qe,showFilterToggle:Ge=!0,searchable:Xe=!0,searchPlaceholder:Kt="Search...",defaultSearchValue:It="",searchValue:Jt,searchDebounce:Yt=300,rowSelection:P,expandable:p,editMode:J="dblclick",showEditIcon:Ut=!1,onCellEdit:Ze,exportable:Qt=!0,exportFileName:_t="table_export",exportFormat:Ee="csv",columnToggle:qt=!1,bordered:Gt=!0,striped:Xt=!1,hover:Zt=!0,compact:x=!1,cellPadding:he,stickyHeader:et=!1,maxHeight:en,rowClassName:Te,rowStyle:Ne,classNames:b={},styles:k={},className:tn,style:nn,emptyText:rn="No data available",onChange:w,onPageChange:fe,onSortChange:tt,onFilterChange:pe,onSearch:nt,onRowClick:Le,onRowDoubleClick:Me,onClearFilters:rt,toolbar:ue,hideToolbar:on=!1,showFooter:ln=!1,caption:ot,isDelete:Ur=!1,isEditModify:Qr,isUpdate:_r,isExport:an,isSelectRow:it,getNonSelectableRows:sn,nonSelectableStyle:dn,isView:qr=!1,fileName:cn,hideExcelSheet:ge=!1,onSelectedRow:hn,selectedRowStyle:fn,selectedRowClassName:pn,onUpdateItem:X,onPageSizeChange:Ce,onFilter:Pe,clearAllFilter:un,onDelete:Gr,onEdit:Xr,onView:Zr,dynamicStylingFields:eo,fieldTypeConfig:Y,showRowNumber:Z=!1,rowNumberWidth:lt=50,rowNumberTitle:gn="#",rowNumberRender:at,toolbarPosition:to="top",toolbarLeft:Cn,toolbarRight:yn,toolbarCenter:bn,refreshable:kn=!1,onRefresh:Sn,printable:Fn=!1,onPrint:xn,size:no="medium",error:ro,onRetry:oo,skeletonLoading:io=!1,skeletonRowCount:lo=5,hideHeader:ao=!1,highlightedRowKeys:so=[],highlightRowStyle:co,highlightRowClassName:ho,onRowMouseEnter:fo,onRowMouseLeave:po,onCellClick:uo,onHeaderClick:go,...st}=$e,mn=an??Qt,je=cn??_t,D=me(()=>N!==void 0&&N>0&&N<=g.length?!1:Qe,[Qe,N,g.length]),f=it?{mode:"checkbox",selectedRowStyle:fn||P?.selectedRowStyle,selectedRowClassName:pn||P?.selectedRowClassName,...P,getCheckboxProps:e=>{const n=e[E],r=sn?.includes(n),o=P?.getCheckboxProps?.(e);return{...o,disabled:r||o?.disabled}},onChange:(e,n)=>{P?.onChange?.(e,n)}}:P,j=ce?{page:0,pageSize:10,showSizeChanger:!0,showQuickJumper:!0,showTotal:!0,pageSizeOptions:[10,20,30,50],...Ue}:Ue,Co={small:{padding:"4px 8px",fontSize:"12px"},medium:{padding:"8px 12px",fontSize:"14px"},large:{padding:"12px 16px",fontSize:"16px"}},wn=$(null),ye=$(null),dt=$(0),[vn,ct]=O(It),[Rn,$n]=O(Ot),[B,ee]=O(!1),[be,ht]=O(""),[En,Be]=O("none");_(()=>{if(!B)return;const e=n=>{ye.current&&!ye.current.contains(n.target)&&ee(!1)};return document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[B]);const We=_e!==void 0,De=We?_e:Rn,yo=u(()=>{const e=!De;We||$n(e),qe?.(e)},[De,We,qe]),[V,L]=O(null),[T,ke]=O(null),U=Jt??vn,v=Rr(U,Yt),{sort:S,handleSort:ft}=Sr(Dt,Vt),{filters:F,setFilter:pt,clearFilters:ut}=Fr(Ht,At),te=$(!1),Se=$("filter"),gt=$(Pe),Tn=$(null),ne=$(null),re=$(null);_(()=>{const e=n=>{re.current&&!re.current.contains(n.target)&&(ne.current=null)};return document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[]),_(()=>{const e=()=>{if(ne.current&&re.current){const r=re.current.querySelector(`[data-filter-field="${ne.current}"]`);if(r&&document.activeElement!==r){r.focus();const o=r.value?.length||0;r.setSelectionRange(o,o)}}},n=[requestAnimationFrame(()=>e()),setTimeout(()=>e(),50),setTimeout(()=>e(),150)];return()=>{n.forEach(r=>{typeof r=="number"&&(cancelAnimationFrame(r),clearTimeout(r))})}},[g]);const{page:C,pageSize:m,totalPages:bo,goToPage:Ct,goToNextPage:ko,goToPrevPage:So,goToFirstPage:Fo,goToLastPage:xo,changePageSize:yt}=xr(j?.page||0,j?.pageSize||10,N??g.length),{selectedKeys:z,isSelected:Nn,toggleRow:Fe,toggleAll:bt,isAllSelected:Ve,isIndeterminate:Ln}=mr(g,f?.keyField||E,f?.mode||"none",f?.selectedRowKeys,f?.getCheckboxProps),{expandedKeys:mo,isExpanded:Mn,toggleExpand:oe}=wr(p?.keyField||E,p?.defaultExpandedRowKeys,p?.expandedRowKeys,p?.accordion),{visibleColumns:H,toggleColumn:xe,isColumnHidden:ie}=vr(R,de);_(()=>{gt.current=Pe},[Pe]);const kt=$(v),St=$(JSON.stringify(F));_(()=>{if(!te.current)return;const e=JSON.stringify(F),n=kt.current!==v,r=St.current!==e;if(!n&&!r){te.current=!1;return}kt.current=v,St.current=e;const o={};Object.keys(F).forEach(i=>{const d=F[i];d!=null&&d!==""&&(o[i]=d)});const a=Object.keys(o).length>0,c={...o};Se.current==="search"&&v&&(c.srText=v),gt.current?.(Se.current,c,C,m),te.current=!1},[v,F,C,m]),_(()=>{const e=z.size,n=dt.current;e>n?Be("up"):e<n&&Be("down"),dt.current=e;const r=setTimeout(()=>{Be("none")},300);return()=>clearTimeout(r)},[z.size]);const ze=me(()=>{if(D)return g;let e=[...g];return e=Ye(e,F,R,v),e=$r(e,S,R),ce&&(e=Er(e,C,m)),e},[g,F,S,C,m,v,D,ce,R]),le=me(()=>N!==void 0&&N>0?N:D?g.length:Ye(g,F,R,v).length,[g,F,R,v,D,N]),He=u(e=>{ct(e),nt?.(e),te.current=!0,Se.current="search",w?.({type:"search",search:e})},[nt,w]),Ae=u(e=>{if(!e.sort)return;const n=ft(e.dataField,S.order);tt?.(n),w?.({type:"sort",sort:n})},[S,ft,tt,w]),Ft=u((e,n)=>{pt(e,n);const r={...F,[e]:n};pe?.(r),te.current=!0,Se.current="filter",w?.({type:"filter",filters:r})},[F,pt,pe,w]),xt=u(()=>{ut(),ct(""),rt?.(),un?.(),pe?.({}),w?.({type:"filter",filters:{}}),Tn.current=null},[ut,rt,pe,w]),Q=u(e=>{Ct(e);const n=e+1;Ce?.(n,m),fe?.(n,m),w?.({type:"pagination",pagination:{page:n,pageSize:m}})},[Ct,m,Ce,fe,w]),Pn=u(e=>{yt(e),Ce?.(1,e),fe?.(1,e),w?.({type:"pagination",pagination:{page:1,pageSize:e}})},[yt,Ce,fe,w]),jn=u((e,n,r)=>{if(f?.mode==="single"){const o=Fe(e);o&&f?.onChange?.(o.selectedKeys,o.selectedRows)}if(p?.expandRowByClick){const o=oe(e);o&&p.onExpandChange?.(o.expandedKeys,o.expanded,e)}Le?.(e,n,r)},[P,p,Fe,oe,Le]),ae=u((e,n,r,o)=>{const a=!!e.editorRenderer;if(e.editable===void 0)return{isEditable:a};if(e.editable===!1)return{isEditable:!1};if(e.editable===!0)return{isEditable:!0};const c=G(n,e.dataField),i=e.editable(c,n,r,o);return typeof i=="boolean"?{isEditable:i}:{isEditable:!0,customEditor:i}},[]),Bn=u((e,n,r,o,a)=>{if(r.events?.onDoubleClick?.(a,e,n,r,o),J!=="none"){const{isEditable:c}=ae(r,e,n,o);c&&J==="dblclick"&&(L({row:n,field:r.dataField}),ke(G(e,r.dataField)))}Me?.(e,n,a)},[J,Me,ae]),Wn=u((e,n,r,o,a)=>{if(a&&r.events?.onClick?.(a,e,n,r,o),J==="click"){const{isEditable:c}=ae(r,e,n,o);c&&(L({row:n,field:r.dataField}),ke(G(e,r.dataField)))}},[J,ae]),Oe=u((e,n,r)=>{if(V){if(r.validator){const a=r.validator(T,e);if(a!==!0){alert(typeof a=="string"?a:"Invalid value"),L(null);return}}const o=e[E];Ze?.(T,r.dataField,e,n),X?.(T,r.dataField,o)}L(null)},[V,T,Ze,X,E]),Dn=(e,n)=>n.split(".").reduce((r,o)=>r?.[o],e),mt=u((e,n,r)=>{const o=Y?.[n],a=typeof o=="string"?{type:o}:o;switch(a?.type||"string"){case"array":return a?.fields&&a.fields.length>0?Array.isArray(e)?e.slice(0,a.maxItems||e.length).map(l=>typeof l=="object"&&a.fields?a.fields.map(y=>l[y]).filter(Boolean).join(", "):typeof l=="string"?l:"").filter(Boolean).join(a.separator||"; "):e||"":Array.isArray(e)?e.map(l=>typeof l=="object"?JSON.stringify(l):l).join("; "):e||"";case"object":if(!e||typeof e!="object")return"";const i=a?.fields||a?.keys||[],d=a?.labelMap||{};return i.length>0?i.map(l=>{const y=Dn(e,l);return y!=null?`${d[l]||l}: ${y}`:null}).filter(Boolean).join(", "):Object.entries(e).map(([l,y])=>typeof y=="boolean"?`${l}: ${y?"Yes":"No"}`:`${l}: ${y}`).join(", ");case"date":if(!e)return"";try{const l=new Date(e),y=a?.dateFormat||"YYYY-MM-DD HH:mm:ss";return l.toISOString().slice(0,19).replace("T"," ")}catch{return String(e)}case"number":return e!=null?String(Number(e)):"";case"boolean":return typeof e=="boolean"?e?"Yes":"No":"";default:return typeof e=="boolean"?e?"Yes":"No":e!=null?String(e):""}},[Y]),wt=u(async()=>{const e=D?g:Ye(g,F,R,v);let n=H.filter(o=>o.csvExport!==!1);Array.isArray(ge)&&(n=n.filter(o=>!ge.includes(o.dataField))),Y&&(n=n.filter(o=>{const a=Y[o.dataField],c=typeof a=="string"?{type:a}:a;return!(c?.hideFromExport||c?.csvExport===!1)}));const r=n.map(o=>{const a=Y?.[o.dataField],c=typeof a=="string"?{type:a}:a;return o.csvFormatter?o:c?.exportFormatter?{...o,csvFormatter:c.exportFormatter}:c?.type?{...o,csvFormatter:(i,d)=>mt(i,o.dataField,d)}:o});Ee==="excel"?await Nr(e,r,je):Tr(e,r,je)},[g,F,R,v,H,ge,Y,mt,je,D,Ee]),Vn=u((e,n)=>{n.stopPropagation();const r=Fe(e);r&&f?.onChange?.(r.selectedKeys,r.selectedRows)},[Fe,P]),zn=u(()=>{const e=bt(!Ve);e&&f?.onChange?.(e.selectedKeys,e.selectedRows)},[bt,Ve,f]),Hn=u((e,n)=>{n.stopPropagation();const r=oe(e);p?.onExpandChange?.(r.expandedKeys,r.expanded,e)},[oe,p]),se=me(()=>R.filter(e=>e.dataField!==E&&e.text.toLowerCase().includes(be.toLowerCase())),[R,E,be]),vt=u(e=>e[E],[E]),Rt=u((e,n,r,o)=>{const a=G(e,n.dataField);if(V?.row===r&&V?.field===n.dataField){if(n.editorRenderer){const i=e[E],d={value:T,onUpdate:l=>{ke(l),X?.(l,n.dataField,i),L(null)},onCancel:()=>L(null),onBlur:()=>{T!==a&&X?.(T,n.dataField,i),L(null)},row:e,column:n,rowIndex:r,columnIndex:o,rowId:i,dataField:n.dataField,onUpdateItem:l=>{X?.(l,n.dataField,i),L(null)}};return n.editorRenderer(d,T,e,n,r,o)}return t(yr,{type:n.editorType==="number"?"number":"text",value:T??"",onChange:i=>ke(i.target.value),onBlur:()=>Oe(e,r,n),onKeyDown:i=>{i.key==="Enter"&&Oe(e,r,n),i.key==="Escape"&&L(null)},className:n.editorClasses,style:n.editorStyle,autoFocus:!0})}return n.formatter?n.formatter(a,e,r,o):a==null?"":typeof a=="boolean"?a?"Yes":"No":typeof a=="object"?JSON.stringify(a):String(a)},[V,T,Oe]),An=()=>{if(on)return null;if(typeof ue=="function")return ue({searchValue:U,onSearch:He,onClearFilters:xt,onExport:wt});if(ue)return ue;const e=Object.keys(F).length>0||U;return s(_n,{className:b.toolbar,style:k.toolbar,children:[s(Ie,{children:[Cn,Xe&&s(qn,{children:[t(Pr,{}),t("input",{type:"text",value:U,onChange:n=>He(n.target.value),onFocus:()=>{ne.current=null},placeholder:Kt})]}),Xe&&t(K,{onClick:()=>He(""),disabled:!U,style:{opacity:U?1:.6},children:"Clear"}),t(K,{onClick:xt,disabled:!e,style:{opacity:e?1:.6},children:"Clear all filters"}),mn&&ge!==!0&&s(K,{onClick:wt,children:[t(Or,{}),Ee==="excel"?"Export Excel":"Export CSV"]}),Ge&&s("div",{ref:ye,style:{position:"relative"},children:[t(Mr,{content:"Show/Hide Columns",position:"bottom",children:t(K,{$active:B,onClick:()=>ee(!B),"aria-label":"Toggle column visibility",style:{padding:"0 8px"},children:t(Ar,{})})}),B&&s(Tt,{children:[s(Nt,{children:[t("span",{children:"Show/Hide Columns"}),t("button",{onClick:()=>ee(!1),children:t(jt,{})})]}),t(Lt,{children:t("input",{type:"text",value:be,onChange:n=>ht(n.target.value),placeholder:"Search columns..."})}),s(Mt,{children:[s(Je,{style:{borderBottom:"1px solid #e5e7eb",paddingBottom:8,marginBottom:4},children:[t("input",{type:"checkbox",checked:se.length>0&&se.every(n=>!ie(n.dataField)),onChange:n=>{se.forEach(r=>{n.target.checked?ie(r.dataField)&&xe(r.dataField):ie(r.dataField)||xe(r.dataField)})}}),t("span",{style:{fontWeight:600},children:"Select All"})]}),se.map(n=>s(Je,{children:[t("input",{type:"checkbox",checked:!ie(n.dataField),onChange:()=>xe(n.dataField)}),t("span",{children:n.text})]},n.dataField))]})]})]})]}),bn,s(Ie,{children:[kn&&s(K,{onClick:Sn,children:[t(Jr,{}),"Refresh"]}),Fn&&s(K,{onClick:xn,children:[t(Yr,{}),"Print"]}),qt&&s("div",{ref:Ge?void 0:ye,style:{position:"relative"},children:[s(K,{$active:B,onClick:()=>ee(!B),children:[t(Kr,{}),"Columns"]}),B&&s(Tt,{children:[s(Nt,{children:[t("span",{children:"Toggle Columns"}),t("button",{onClick:()=>ee(!1),children:t(jt,{})})]}),t(Lt,{children:t("input",{type:"text",value:be,onChange:n=>ht(n.target.value),placeholder:"Search columns..."})}),t(Mt,{children:se.map(n=>s(Je,{children:[t("input",{type:"checkbox",checked:!ie(n.dataField),onChange:()=>xe(n.dataField)}),t("span",{children:n.text})]},n.dataField))})]})]}),yn]})]})},On=()=>{if(!ce)return null;const e=Math.ceil(le/m)||1,n=le>0?C*m+1:0,r=D?g.length:ze.length,o=Math.min(C*m+r,le),a=j?.showTotal===!0?`Showing ${n} to ${o} of ${le} Results`:typeof j?.showTotal=="function"?j.showTotal(le,[n,o]):null,c=()=>{const i=[];if(e<=5)for(let l=0;l<e;l++)i.push(l);else if(C<3){for(let l=0;l<4;l++)i.push(l);i.push("..."),i.push(e-1)}else if(C>e-4){i.push(0),i.push("...");for(let l=e-4;l<e;l++)i.push(l)}else{i.push(0),i.push("...");for(let l=C-1;l<=C+1;l++)i.push(l);i.push("..."),i.push(e-1)}return i};return s(sr,{className:b.pagination,style:k.pagination,children:[s(Ie,{children:[(f?.mode==="checkbox"||it)&&z.size>0&&s(br,{onClick:()=>{const i=g.filter(d=>z.has(vt(d)));f?.onChange?.(Array.from(z),i),hn?.(i)},children:[t(kr,{$animate:En,children:z.size},z.size),t("span",{children:"Selected"})]}),j?.showSizeChanger!==!1&&t(hr,{value:m,onChange:i=>Pn(Number(i.target.value)),children:(j?.pageSizeOptions||[10,20,30,50]).map(i=>t("option",{value:i,children:i},i))})]}),s(cr,{children:[t(q,{onClick:()=>Q(0),disabled:C===0,children:t(Vr,{})}),t(q,{onClick:()=>Q(C-1),disabled:C===0,children:t(Wr,{})}),c().map((i,d)=>typeof i=="string"?t("span",{style:{padding:"0 4px",color:"white"},children:i},`ellipsis-${d}`):t(q,{$active:i===C,onClick:()=>Q(i),children:i+1},i)),t(q,{onClick:()=>Q(C+1),disabled:C>=e-1,children:t(Dr,{})}),t(q,{onClick:()=>Q(e-1),disabled:C>=e-1,children:t(zr,{})})]}),a&&t(dr,{children:a}),j?.showQuickJumper&&(()=>{const i=d=>{const l=parseInt(d.value,10);return!isNaN(l)&&l>=1&&l<=e?(Q(l-1),d.value="",!0):!1};return s(fr,{children:["Go to",t("input",{type:"number",min:1,max:e,placeholder:`1-${e}`,onKeyDown:d=>{if(d.key==="Enter"){d.preventDefault();const l=d.target;i(l)&&l.blur()}},onBlur:d=>{const l=d.target;i(l)}}),t(q,{onClick:()=>{const d=document.querySelector(`#${de} input[type="number"]`);d&&(i(d),d.blur())},style:{marginLeft:"4px",padding:"2px 8px"},children:"Go"})]})})()]})},Kn=(zt||R.some(e=>typeof e.filter=="function"||e.filterComponent||e.filter===!0))&&De;return s(Qn,{ref:e=>{typeof I=="function"?I(e):I&&(I.current=e),re.current=e},$bordered:Gt,$compact:x,className:tn||b.root,style:{...k.root,...nn,position:"relative"},"aria-label":st["aria-label"],"aria-labelledby":st["aria-labelledby"],children:[Bt&&t(ur,{className:b.loading,style:k.loading,children:Wt||t(gr,{})}),An(),t(Gn,{$maxHeight:en,$stickyHeader:et,className:b.wrapper,style:k.wrapper,children:s(Xn,{ref:wn,$striped:Xt,$hover:Zt,$compact:x,role:"grid",children:[ot&&t("caption",{className:"sr-only",children:ot}),t(Zn,{$sticky:et,className:b.header,style:k.header,children:s(er,{className:b.headerRow,style:k.headerRow,children:[f?.mode==="checkbox"&&t(we,{$align:"center",$sortable:!1,$compact:x,$width:f.columnWidth||40,children:!f.hideSelectAll&&t(Et,{checked:Ve,ref:e=>{e&&(e.indeterminate=Ln)},onChange:zn})}),p&&t(we,{$align:"center",$sortable:!1,$compact:x,$width:p.columnWidth||40}),Z&&t(we,{$align:"center",$sortable:!1,$compact:x,$width:lt,children:gn}),H.map((e,n)=>{const r=typeof e.filter=="function"||e.filter===!0||e.filterComponent||e.filterRenderer,o=r?(typeof e.filter=="function"?e.filter:null)||e.filterComponent||Lr(e.filterType||"text"):null,a=c=>Ft(e.dataField,c);return t(we,{$align:e.headerAlign||e.align||"left",$sortable:!!e.sort,$compact:x,$width:e.width,$minWidth:e.minWidth,$pinned:e.pinned,$customClass:!!e.headerClasses,className:[e.headerClasses,b.headerCell].filter(Boolean).join(" "),style:typeof e.headerStyle=="function"?e.headerStyle(e):e.headerStyle||k.headerCell,role:"columnheader","aria-sort":S.field===e.dataField?S.order==="asc"?"ascending":S.order==="desc"?"descending":"none":void 0,children:(()=>{const c=typeof e.headerStyle=="function"?e.headerStyle(e):e.headerStyle,i=e.isHeaderTitle!==!1&&e.hideHeaderText!==!0&&!(c&&c.fontSize===0),d=e.isHeaderFilterComp!==!1&&Kn&&r&&o,l=e.isHeaderSort!==!1&&e.sort;return d?s("div",{style:{display:"flex",flexDirection:"column",gap:4,width:"100%"},children:[i&&t("span",{style:{color:"white",fontWeight:600,fontSize:12,whiteSpace:"nowrap",cursor:l?"pointer":"default"},onClick:()=>l&&Ae(e),children:e.headerFormatter?e.headerFormatter(e,n):e.headerText||e.text}),s("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",gap:6,width:"100%",minHeight:24},children:[t("div",{style:{width:l?"80%":"100%",minWidth:0,flexShrink:1,display:"flex",alignItems:"center"},onClick:y=>y.stopPropagation(),children:e.filterRenderer?e.filterRenderer(a,e):t("div",{onFocusCapture:()=>{ne.current=e.dataField},"data-filter-wrapper":e.dataField,children:t(o,{column:e,value:F[e.dataField],onChange:a,onClear:()=>Ft(e.dataField,null)},`filter-${e.dataField}`)})}),l&&t("div",{style:{width:"20%",minWidth:24,height:24,display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0,cursor:"pointer"},onClick:()=>Ae(e),children:e.sortCaret?e.sortCaret(S.field===e.dataField?S.order:null,e):t(Pt,{order:S.field===e.dataField?S.order:null,column:e})})]})]}):s("div",{style:{display:"flex",alignItems:"center",justifyContent:e.headerAlign||e.align||"left",gap:6,width:"100%",cursor:l?"pointer":"default"},onClick:()=>l&&Ae(e),children:[i&&t("span",{style:{color:"white",fontWeight:600,fontSize:12,whiteSpace:"nowrap"},children:e.headerFormatter?e.headerFormatter(e,n):e.headerText||e.text}),l&&t("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0},children:e.sortCaret?e.sortCaret(S.field===e.dataField?S.order:null,e):t(Pt,{order:S.field===e.dataField?S.order:null,column:e})})]})})()},e.dataField)})]})}),t(tr,{className:b.body,style:k.body,children:ze.length===0?t("tr",{children:t("td",{colSpan:H.length+(f?.mode==="checkbox"?1:0)+(p?1:0)+(Z?1:0),children:s(pr,{className:b.empty,style:k.empty,children:[t(Ir,{}),t("span",{children:rn})]})})}):ze.map((e,n)=>{const r=vt(e),o=Nn(r),a=Mn(r),c=f?.getCheckboxProps?.(e),i=p?.rowExpandable?.(e)??!0,d=typeof Te=="function"?Te(e,n):Te,l=typeof Ne=="function"?Ne(e,n):Ne,y=o?typeof f?.selectedRowStyle=="function"?f.selectedRowStyle(e):f?.selectedRowStyle:void 0,Ke=o&&y&&(y.backgroundColor||y.background),In=c?.disabled?dn||{backgroundColor:"#f3f4f6",opacity:.7}:void 0;return s(Yn.Fragment,{children:[s(nr,{$selected:o,$clickable:!!Le||f?.mode==="single"||p?.expandRowByClick===!0,$disabled:!!c?.disabled,$hasCustomSelectedStyle:!!Ke,"data-custom-selected":Ke?"true":void 0,className:`${b.row||""} ${d||""} ${o?typeof f?.selectedRowClassName=="function"?f.selectedRowClassName(e):f?.selectedRowClassName||"":""}`,style:{...k.row,...l,...y,...In},onClick:h=>jn(e,n,h),onDoubleClick:h=>{Me?.(e,n,h)},role:"row","aria-selected":o,children:[f?.mode==="checkbox"&&t(ve,{$align:"center",$compact:x,$padding:he,children:t(Et,{checked:o,disabled:c?.disabled,onChange:h=>Vn(e,h),onClick:h=>h.stopPropagation()})}),p&&t(ve,{$align:"center",$compact:x,$padding:he,children:i&&t(rr,{$expanded:a,onClick:h=>Hn(e,h),children:p.expandIcon?p.expandIcon({expanded:a,row:e,onExpand:()=>oe(e)}):t(Hr,{})})}),Z&&t(ve,{$align:"center",$compact:x,$padding:he,style:{width:lt,color:"#6b7280",fontWeight:500},children:at?at(n+1,e):n+1+C*m}),H.map((h,A)=>{const $t=typeof h.classes=="function"?h.classes(G(e,h.dataField),e,n,A):h.classes,Jn=typeof h.style=="function"?h.style(G(e,h.dataField),e,n,A):h.style;return t(ve,{$align:h.align||"left",$compact:x,$padding:he,$pinned:h.pinned,$hasCustomClass:!!$t,className:$t||b.cell,style:{...k.cell,...Jn},onClick:W=>Wn(e,n,h,A,W),onDoubleClick:W=>{W.stopPropagation(),Bn(e,n,h,A,W)},role:"gridcell",children:(()=>{const W=ae(h,e,n,A);return W.isEditable&&J!=="none"?W.customEditor?W.customEditor:t(Cr,{$editing:V?.row===n&&V?.field===h.dataField,$showEditIcon:Ut,children:Rt(e,h,n,A)}):Rt(e,h,n,A)})()},h.dataField)})]}),p&&a&&i&&t(or,{children:t(ir,{colSpan:H.length+(f?.mode==="checkbox"?1:0)+(p?1:0)+(Z?1:0),children:p.expandedRowRender?.(e,n,a)})})]},r)})}),ln&&t(lr,{className:b.footer,style:k.footer,children:s(ar,{className:b.footerRow,style:k.footerRow,children:[f?.mode==="checkbox"&&t(Re,{$align:"center",$compact:x}),p&&t(Re,{$align:"center",$compact:x}),Z&&t(Re,{$align:"center",$compact:x}),H.map(e=>t(Re,{$align:e.align||"left",$compact:x,className:b.footerCell,style:k.footerCell,children:typeof e.footer=="function"?e.footer(e,g):e.footerFormatter?e.footerFormatter(e,g):e.footer},e.dataField))]})})]})}),On()]})});Table.displayName="Table";export default Table;