react-restyle-components 0.4.39 → 0.4.40

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 (232) hide show
  1. package/lib/index.js +3 -1
  2. package/lib/src/core-components/index.js +1 -1
  3. package/lib/src/core-components/src/components/Accordion/AccordionSection/Accordion.js +15 -1
  4. package/lib/src/core-components/src/components/Accordion/AccordionSection/AccordionContext.js +6 -1
  5. package/lib/src/core-components/src/components/Accordion/AccordionSection/AccordionSection.js +39 -1
  6. package/lib/src/core-components/src/components/Accordion/AccordionSection/Header.js +39 -1
  7. package/lib/src/core-components/src/components/Accordion/AccordionSection/elements.js +94 -57
  8. package/lib/src/core-components/src/components/Accordion/AccordionSection/hooks/useCurrentAccordionIndex.js +13 -1
  9. package/lib/src/core-components/src/components/Accordion/AccordionSection/index.js +3 -1
  10. package/lib/src/core-components/src/components/Accordion/AccordionSection/types.js +9 -1
  11. package/lib/src/core-components/src/components/Accordion/Collapsible/Collapsible2.component.js +249 -1
  12. package/lib/src/core-components/src/components/Action/types.js +8 -1
  13. package/lib/src/core-components/src/components/AlertBanner/AlertBanner.js +45 -1
  14. package/lib/src/core-components/src/components/AlertBanner/elements.js +120 -45
  15. package/lib/src/core-components/src/components/AlertBanner/index.js +2 -1
  16. package/lib/src/core-components/src/components/AlertBanner/types.js +10 -1
  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 +334 -1
  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 +229 -1
  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 +174 -1
  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 +129 -2
  21. package/lib/src/core-components/src/components/AutoComplete/auto-complete-filter-single-select/auto-complete-filter-single-select.component.js +55 -1
  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 +308 -2
  23. package/lib/src/core-components/src/components/AutoComplete/auto-complete-group-by/auto-complete-group-by.component.js +115 -1
  24. package/lib/src/core-components/src/components/AutoComplete/autocomplete/autocomplete.js +442 -2
  25. package/lib/src/core-components/src/components/AutoComplete/index.js +8 -1
  26. package/lib/src/core-components/src/components/Avatar/Avatar.js +148 -14
  27. package/lib/src/core-components/src/components/Badge/Badge.js +25 -2
  28. package/lib/src/core-components/src/components/Badge/InnerBadge/Inline.js +25 -1
  29. package/lib/src/core-components/src/components/Badge/InnerBadge/InnerBadge.js +25 -1
  30. package/lib/src/core-components/src/components/Badge/InnerBadge/elements.js +78 -32
  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 +5 -1
  34. package/lib/src/core-components/src/components/Breadcrumb/Breadcrumb.js +83 -1
  35. package/lib/src/core-components/src/components/Breadcrumb/elements.js +166 -94
  36. package/lib/src/core-components/src/components/Breadcrumb/index.js +3 -1
  37. package/lib/src/core-components/src/components/Breadcrumb/types.js +3 -1
  38. package/lib/src/core-components/src/components/Button/button.component.js +18 -1
  39. package/lib/src/core-components/src/components/Button/buttonGroup/buttonGroup.component.js +4 -1
  40. package/lib/src/core-components/src/components/Button/index.js +2 -1
  41. package/lib/src/core-components/src/components/Button/types.js +1 -1
  42. package/lib/src/core-components/src/components/Chip/Chip.js +64 -1
  43. package/lib/src/core-components/src/components/Chip/elements.js +148 -48
  44. package/lib/src/core-components/src/components/Chip/index.js +2 -1
  45. package/lib/src/core-components/src/components/Chip/types.js +4 -1
  46. package/lib/src/core-components/src/components/Divider/Divider.js +25 -1
  47. package/lib/src/core-components/src/components/Divider/elements.js +68 -31
  48. package/lib/src/core-components/src/components/Divider/index.js +2 -1
  49. package/lib/src/core-components/src/components/Divider/types.js +4 -1
  50. package/lib/src/core-components/src/components/DynamicGrid/DynamicGrid.js +147 -1
  51. package/lib/src/core-components/src/components/DynamicGrid/GridContainer.js +24 -17
  52. package/lib/src/core-components/src/components/DynamicGrid/elements.js +162 -100
  53. package/lib/src/core-components/src/components/DynamicGrid/index.js +3 -1
  54. package/lib/src/core-components/src/components/DynamicGrid/types.js +28 -1
  55. package/lib/src/core-components/src/components/DynamicGrid/utils.js +193 -1
  56. package/lib/src/core-components/src/components/FormField/FormField.js +103 -1
  57. package/lib/src/core-components/src/components/FormField/components/CheckboxGroupInput.js +37 -1
  58. package/lib/src/core-components/src/components/FormField/components/CheckboxInput.js +8 -1
  59. package/lib/src/core-components/src/components/FormField/components/CssMultilineInput.js +192 -1
  60. package/lib/src/core-components/src/components/FormField/components/DatePickerInput.js +99 -1
  61. package/lib/src/core-components/src/components/FormField/components/DropdownInput.js +70 -1
  62. package/lib/src/core-components/src/components/FormField/components/OtpInput.js +81 -1
  63. package/lib/src/core-components/src/components/FormField/components/PasswordInput.js +40 -1
  64. package/lib/src/core-components/src/components/FormField/components/PinInput.js +75 -1
  65. package/lib/src/core-components/src/components/FormField/components/RadioInput.js +54 -1
  66. package/lib/src/core-components/src/components/FormField/components/TextDropdownInput.js +94 -1
  67. package/lib/src/core-components/src/components/FormField/components/ToggleInput.js +36 -1
  68. package/lib/src/core-components/src/components/FormField/components/index.js +11 -1
  69. package/lib/src/core-components/src/components/FormField/css-properties.js +161 -1
  70. package/lib/src/core-components/src/components/FormField/index.js +2 -1
  71. package/lib/src/core-components/src/components/Icon/Icon.js +79 -1
  72. package/lib/src/core-components/src/components/Icon/index.js +2 -1
  73. package/lib/src/core-components/src/components/Icon/types.js +9 -1
  74. package/lib/src/core-components/src/components/Loader/loader.component.js +215 -2
  75. package/lib/src/core-components/src/components/Masonry/Masonry.js +73 -1
  76. package/lib/src/core-components/src/components/Masonry/elements.js +46 -29
  77. package/lib/src/core-components/src/components/Masonry/hooks.js +100 -1
  78. package/lib/src/core-components/src/components/Masonry/index.js +3 -1
  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 +116 -1
  81. package/lib/src/core-components/src/components/Modal/index.js +2 -1
  82. package/lib/src/core-components/src/components/Modal/modal-confirm/modal-confirm.component.js +147 -1
  83. package/lib/src/core-components/src/components/Picker/color-picker/color-picker.component.js +12 -1
  84. package/lib/src/core-components/src/components/Picker/color-picker-modal/color-picker-modal.component.js +40 -1
  85. package/lib/src/core-components/src/components/Picker/index.js +2 -1
  86. package/lib/src/core-components/src/components/Selection/index.js +4 -1
  87. package/lib/src/core-components/src/components/Selection/multi-select/multi-select.component.js +49 -1
  88. package/lib/src/core-components/src/components/Selection/multi-select-with-field/multi-select-with-field.component.js +58 -1
  89. package/lib/src/core-components/src/components/Selection/multi-selection-dropdown/multi-selection-dropdown.component.js +43 -1
  90. package/lib/src/core-components/src/components/Selection/single-select/single-select.component.js +87 -1
  91. package/lib/src/core-components/src/components/Skeleton/Skeleton.js +51 -1
  92. package/lib/src/core-components/src/components/Skeleton/elements.js +143 -54
  93. package/lib/src/core-components/src/components/Skeleton/index.js +2 -1
  94. package/lib/src/core-components/src/components/Skeleton/types.js +4 -1
  95. package/lib/src/core-components/src/components/SpeedDial/SpeedDial.js +128 -1
  96. package/lib/src/core-components/src/components/SpeedDial/elements.js +132 -62
  97. package/lib/src/core-components/src/components/SpeedDial/index.js +2 -1
  98. package/lib/src/core-components/src/components/SpeedDial/types.js +3 -1
  99. package/lib/src/core-components/src/components/Stepper2/stepper.component.js +139 -1
  100. package/lib/src/core-components/src/components/Switch/Switch.js +26 -1
  101. package/lib/src/core-components/src/components/Switch/elements.js +103 -34
  102. package/lib/src/core-components/src/components/Switch/index.js +2 -1
  103. package/lib/src/core-components/src/components/Switch/types.js +3 -1
  104. package/lib/src/core-components/src/components/Table/Table.js +1332 -1
  105. package/lib/src/core-components/src/components/Table/columnReorder.d.ts +128 -0
  106. package/lib/src/core-components/src/components/Table/columnReorder.js +530 -0
  107. package/lib/src/core-components/src/components/Table/columnResize.d.ts +99 -0
  108. package/lib/src/core-components/src/components/Table/columnResize.js +399 -0
  109. package/lib/src/core-components/src/components/Table/elements.d.ts +9 -1
  110. package/lib/src/core-components/src/components/Table/elements.js +324 -155
  111. package/lib/src/core-components/src/components/Table/filters.js +555 -30
  112. package/lib/src/core-components/src/components/Table/hooks.js +536 -2
  113. package/lib/src/core-components/src/components/Table/index.d.ts +4 -0
  114. package/lib/src/core-components/src/components/Table/index.js +6 -1
  115. package/lib/src/core-components/src/components/Table/types.d.ts +58 -0
  116. package/lib/src/core-components/src/components/Table/types.js +1 -1
  117. package/lib/src/core-components/src/components/Tabs/tabs.component.js +22 -1
  118. package/lib/src/core-components/src/components/Tags1/Tags.component.js +118 -1
  119. package/lib/src/core-components/src/components/Tags1/types.js +20 -1
  120. package/lib/src/core-components/src/components/Timer1/timer.component.js +76 -1
  121. package/lib/src/core-components/src/components/Toast/Toast.js +50 -1
  122. package/lib/src/core-components/src/components/Toast/elements.js +122 -41
  123. package/lib/src/core-components/src/components/Toast/index.js +2 -1
  124. package/lib/src/core-components/src/components/Toast/types.js +9 -1
  125. package/lib/src/core-components/src/components/Tooltip/Tooltip.js +200 -1
  126. package/lib/src/core-components/src/components/Tooltip/elements.js +117 -55
  127. package/lib/src/core-components/src/components/Tooltip/index.js +2 -1
  128. package/lib/src/core-components/src/components/Tooltip/types.js +17 -1
  129. package/lib/src/core-components/src/components/Tooltip/utils.js +140 -1
  130. package/lib/src/core-components/src/components/TreeSelect/TreeSelect.js +303 -1
  131. package/lib/src/core-components/src/components/TreeSelect/elements.js +216 -117
  132. package/lib/src/core-components/src/components/TreeSelect/hooks.js +252 -1
  133. package/lib/src/core-components/src/components/TreeSelect/index.js +3 -1
  134. package/lib/src/core-components/src/components/TreeSelect/types.js +1 -1
  135. package/lib/src/core-components/src/components/index.js +30 -1
  136. package/lib/src/core-components/src/components/pdf/pdf-images.components.js +7 -1
  137. package/lib/src/core-components/src/components/pdf/pdf-table.components.js +48 -5
  138. package/lib/src/core-components/src/components/pdf/pdf-typography.components.js +70 -1
  139. package/lib/src/core-components/src/components/pdf/pdf-wrapped-view.components.js +50 -1
  140. package/lib/src/core-components/src/core-components/Avatar.js +33 -4
  141. package/lib/src/core-components/src/core-components/CoreButton/CoreButton.js +10 -1
  142. package/lib/src/core-components/src/core-components/CoreButton/elements.js +176 -67
  143. package/lib/src/core-components/src/core-components/CoreButton/index.js +3 -1
  144. package/lib/src/core-components/src/core-components/CoreButton/types.js +6 -1
  145. package/lib/src/core-components/src/core-components/CoreButton/utils.js +12 -1
  146. package/lib/src/core-components/src/core-components/Divider/Divider.js +19 -4
  147. package/lib/src/core-components/src/core-components/Divider/index.js +1 -1
  148. package/lib/src/core-components/src/core-components/SelectionCardStrip/index.js +1 -1
  149. package/lib/src/core-components/src/core-components/SelectionCardStrip/selectionCardStrip.js +33 -10
  150. package/lib/src/core-components/src/core-components/StateLayer.js +5 -3
  151. package/lib/src/core-components/src/core-components/ToggleCore/elements.js +50 -25
  152. package/lib/src/core-components/src/core-components/ToggleCore/index.js +2 -1
  153. package/lib/src/core-components/src/core-components/ToggleCore/toggleCore.js +14 -1
  154. package/lib/src/core-components/src/core-components/atoms/Input/Input.js +22 -1
  155. package/lib/src/core-components/src/core-components/atoms/Label/Label.js +21 -1
  156. package/lib/src/core-components/src/core-components/atoms/Textarea/Textarea.js +19 -1
  157. package/lib/src/core-components/src/core-components/index.js +3 -1
  158. package/lib/src/core-components/src/helpers/constants.js +11 -1
  159. package/lib/src/core-components/src/hooks/index.js +1 -1
  160. package/lib/src/core-components/src/hooks/outside.hook.js +28 -1
  161. package/lib/src/core-components/src/index.js +12 -1
  162. package/lib/src/core-components/src/tc.global.css +12 -1
  163. package/lib/src/core-components/src/tc.module.css +1 -1
  164. package/lib/src/core-components/src/utils/abstracts/breakpoints/index.js +28 -1
  165. package/lib/src/core-components/src/utils/abstracts/colors/index.js +49 -1
  166. package/lib/src/core-components/src/utils/abstracts/index.js +5 -1
  167. package/lib/src/core-components/src/utils/abstracts/space/index.js +26 -1
  168. package/lib/src/core-components/src/utils/abstracts/theme/ThemeBoundary.js +8 -1
  169. package/lib/src/core-components/src/utils/abstracts/theme/default-themes.js +30 -1
  170. package/lib/src/core-components/src/utils/abstracts/theme/index.js +3 -1
  171. package/lib/src/core-components/src/utils/abstracts/theme/theme.js +30 -1
  172. package/lib/src/core-components/src/utils/abstracts/theme/types.js +1 -1
  173. package/lib/src/core-components/src/utils/abstracts/theme/useTheme.js +17 -1
  174. package/lib/src/core-components/src/utils/abstracts/typography/index.js +25 -1
  175. package/lib/src/core-components/src/utils/context/DefaultsProvider.js +8 -1
  176. package/lib/src/core-components/src/utils/context/InternalProvider.js +24 -1
  177. package/lib/src/core-components/src/utils/context/index.js +2 -1
  178. package/lib/src/core-components/src/utils/designTokens.js +125 -1
  179. package/lib/src/core-components/src/utils/helpers/attachSubComponents.js +23 -1
  180. package/lib/src/core-components/src/utils/helpers/flattenChildren.js +11 -1
  181. package/lib/src/core-components/src/utils/helpers/getChildByType.js +3 -1
  182. package/lib/src/core-components/src/utils/helpers/index.js +5 -1
  183. package/lib/src/core-components/src/utils/helpers/isComponentType.js +16 -1
  184. package/lib/src/core-components/src/utils/helpers/separateChildrenByType.js +12 -1
  185. package/lib/src/core-components/src/utils/hooks/index.js +18 -1
  186. package/lib/src/core-components/src/utils/hooks/useClickOutside.js +18 -1
  187. package/lib/src/core-components/src/utils/hooks/useCombinedRefs.js +17 -1
  188. package/lib/src/core-components/src/utils/hooks/useDebouncedCallback.js +12 -1
  189. package/lib/src/core-components/src/utils/hooks/useDebouncedValue.js +20 -1
  190. package/lib/src/core-components/src/utils/hooks/useDeprecation.js +40 -1
  191. package/lib/src/core-components/src/utils/hooks/useDeviceDetect.js +10 -1
  192. package/lib/src/core-components/src/utils/hooks/useDeviceForm.js +24 -1
  193. package/lib/src/core-components/src/utils/hooks/useDisableBodyScroll.js +16 -1
  194. package/lib/src/core-components/src/utils/hooks/useHoverState.js +36 -1
  195. package/lib/src/core-components/src/utils/hooks/useId.js +7 -1
  196. package/lib/src/core-components/src/utils/hooks/useIsBrowser.js +11 -1
  197. package/lib/src/core-components/src/utils/hooks/useMediaQuery.js +16 -1
  198. package/lib/src/core-components/src/utils/hooks/useOverflow.js +22 -1
  199. package/lib/src/core-components/src/utils/hooks/useSafeLayoutEffect.js +5 -1
  200. package/lib/src/core-components/src/utils/hooks/useScrollingUp.js +18 -1
  201. package/lib/src/core-components/src/utils/hooks/useTrapFocus.js +30 -1
  202. package/lib/src/core-components/src/utils/hooks/useWindowDimensions.js +23 -1
  203. package/lib/src/core-components/src/utils/index.js +9 -1
  204. package/lib/src/core-components/src/utils/stories/Wrappers.js +23 -8
  205. package/lib/src/core-components/src/utils/stories/cleanProps.js +5 -1
  206. package/lib/src/core-components/src/utils/stories/index.js +4 -1
  207. package/lib/src/core-components/src/utils/stories/sleep.js +4 -1
  208. package/lib/src/core-components/src/utils/stories/view-ports.js +50 -1
  209. package/lib/src/core-components/src/utils/styling/calcWidthOfColumns.js +5 -1
  210. package/lib/src/core-components/src/utils/styling/createGridContainer.js +12 -6
  211. package/lib/src/core-components/src/utils/styling/createTransition.js +7 -2
  212. package/lib/src/core-components/src/utils/styling/forwardProps.js +10 -1
  213. package/lib/src/core-components/src/utils/styling/index.js +5 -1
  214. package/lib/src/core-components/src/utils/styling/pxToRem.js +6 -1
  215. package/lib/src/core-components/src/utils/testing/getComputedStyle.js +3 -1
  216. package/lib/src/core-components/src/utils/testing/index.js +1 -1
  217. package/lib/src/core-components/src/utils/utility.util.js +14 -1
  218. package/lib/src/core-components/tailwind.config.js +233 -1
  219. package/lib/src/core-hooks/index.js +3 -1
  220. package/lib/src/core-hooks/src/useClickOutside/useClickOutside.hook.js +46 -1
  221. package/lib/src/core-hooks/src/useDebounce/useDebounce.hook.js +30 -1
  222. package/lib/src/core-hooks/src/usePreventEKey/usePreventEKey.hook.js +8 -1
  223. package/lib/src/core-utils/index.js +7 -1
  224. package/lib/src/core-utils/src/calculation/calculation.util.js +89 -1
  225. package/lib/src/core-utils/src/colors/color.util.js +15 -1
  226. package/lib/src/core-utils/src/convert/numberToWords/numToWords.util.js +145 -1
  227. package/lib/src/core-utils/src/convert/typography/camelCaseToTitleCase.util.js +5 -1
  228. package/lib/src/core-utils/src/form-helper/form-helper.util.js +82 -1
  229. package/lib/src/core-utils/src/index.js +7 -1
  230. package/lib/src/core-utils/src/utility/utility.util.js +12 -1
  231. package/lib/src/core-utils/src/uuid/uuid.util.js +8 -1
  232. package/package.json +1 -1
@@ -1,2 +1,536 @@
1
- "use strict";import{useState as g,useCallback as S,useMemo as D,useEffect as R}from"react";export function useTableDebounce(r,e){const[s,t]=g(r);return R(()=>{const a=setTimeout(()=>{t(r)},e);return()=>clearTimeout(a)},[r,e]),s}export function useSortState(r,e,s=!1){const[t,a]=g(r||{field:"",order:null}),i=e??t,o=S((n,l)=>{let c;i.field!==n||l===null?c="asc":l==="asc"?c="desc":c=null;const u={field:n,order:c};return a(u),u},[i.field]);return{sort:i,handleSort:o,setSort:a}}export function useFilterState(r,e){const[s,t]=g(r||{}),a=e??s,i=S((n,l)=>{t(c=>{if(l==null||l===""){const{[n]:u,...x}=c;return x}return{...c,[n]:l}})},[]),o=S(()=>{t({})},[]);return{filters:a,setFilter:i,clearFilters:o,setFilters:t}}export function usePaginationState(r=0,e=10,s=0){const[t,a]=g(r),[i,o]=g(e),n=Math.ceil(s/i)||1,l=S(w=>{const d=Math.max(0,Math.min(w,n-1));a(d)},[n]),c=S(()=>{l(t+1)},[t,l]),u=S(()=>{l(t-1)},[t,l]),x=S(()=>{l(0)},[l]),m=S(()=>{l(n-1)},[n,l]),f=S(w=>{o(w),a(0)},[]);return{page:t,pageSize:i,totalPages:n,goToPage:l,goToNextPage:c,goToPrevPage:u,goToFirstPage:x,goToLastPage:m,changePageSize:f,setPage:a,setPageSize:o}}export function useRowSelection(r,e="_id",s="none",t,a){const[i,o]=g(new Set),n=t?new Set(t):i,l=S(w=>n.has(w),[n]),c=S(w=>{const d=w[e];if(a?.(w)?.disabled)return;if(s==="single")return o(new Set([d])),{selectedKeys:[d],selectedRows:[w]};o(b=>{const E=new Set(b);return E.has(d)?E.delete(d):E.add(d),E});const h=n.has(d)?Array.from(n).filter(b=>b!==d):[...Array.from(n),d];return{selectedKeys:h,selectedRows:r.filter(b=>h.includes(b[e]))}},[r,e,s,n,a]),u=S(w=>{if(w){const d=r.filter(p=>!a?.(p)?.disabled).map(p=>p[e]);return o(new Set(d)),{selectedKeys:d,selectedRows:r.filter(p=>d.includes(p[e]))}}else return o(new Set),{selectedKeys:[],selectedRows:[]}},[r,e,a]),x=D(()=>r.length===0?!1:r.filter(d=>!a?.(d)?.disabled).every(d=>n.has(d[e])),[r,n,e,a]),m=D(()=>{if(r.length===0)return!1;const w=r.filter(p=>!a?.(p)?.disabled),d=w.filter(p=>n.has(p[e])).length;return d>0&&d<w.length},[r,n,e,a]),f=S(()=>{o(new Set)},[]);return{selectedKeys:n,isSelected:l,toggleRow:c,toggleAll:u,isAllSelected:x,isIndeterminate:m,clearSelection:f,setSelected:o}}export function useRowExpansion(r="_id",e,s,t=!1){const[a,i]=g(new Set(e||[])),o=s?new Set(s):a,n=S(c=>o.has(c),[o]),l=S(c=>{const u=c[r];return i(m=>{const f=t?new Set:new Set(m);return m.has(u)?f.delete(u):f.add(u),f}),{expandedKeys:o.has(u)?Array.from(o).filter(m=>m!==u):t?[u]:[...Array.from(o),u],expanded:!o.has(u),row:c}},[r,o,t]);return{expandedKeys:o,isExpanded:n,toggleExpand:l,setExpanded:i}}export function useColumnVisibility(r,e){const[s,t]=g(()=>{if(e&&typeof window<"u"){const n=localStorage.getItem(`table_columns_${e}`);if(n)try{return new Set(JSON.parse(n))}catch{}}return new Set(r.filter(n=>n.hidden).map(n=>n.dataField))}),a=D(()=>r.filter(n=>!s.has(n.dataField)),[r,s]),i=S(n=>{t(l=>{const c=new Set(l);return c.has(n)?c.delete(n):c.add(n),e&&typeof window<"u"&&localStorage.setItem(`table_columns_${e}`,JSON.stringify(Array.from(c))),c})},[e]),o=S(()=>{t(new Set),e&&typeof window<"u"&&localStorage.removeItem(`table_columns_${e}`)},[e]);return{hiddenColumns:s,visibleColumns:a,toggleColumn:i,showAllColumns:o,isColumnHidden:n=>s.has(n)}}export function sortData(r,e,s){if(!e.field||!e.order)return r;const t=s.find(i=>i.dataField===e.field);return t?[...r].sort((i,o)=>{const n=getNestedValue(i,e.field),l=getNestedValue(o,e.field);if(t.sortFunc)return t.sortFunc(n,l,e.order,i,o);if(n===l)return 0;if(n==null)return 1;if(l==null)return-1;const c=typeof n=="string"?n.localeCompare(l):n<l?-1:1;return e.order==="asc"?c:-c}):r}export function filterData(r,e,s,t){let a=r;for(const[i,o]of Object.entries(e))o==null||o===""||!s.find(l=>l.dataField===i)||(a=a.filter(l=>{const c=getNestedValue(l,i);return typeof o=="object"&&o!==null?"number"in o&&"comparator"in o?y(c,o.number,o.comparator):"startDate"in o?F(c,o):!0:c==null?!1:String(c).toLowerCase().includes(String(o).toLowerCase())}));if(t){const i=t.toLowerCase();a=a.filter(o=>s.some(n=>{const l=getNestedValue(o,n.dataField);return l==null?!1:String(l).toLowerCase().includes(i)}))}return a}export function paginateData(r,e,s){const t=e*s;return r.slice(t,t+s)}export function getNestedValue(r,e){return e.split(".").reduce((s,t)=>s?.[t],r)}function y(r,e,s){const t=parseFloat(r),a=parseFloat(e);if(isNaN(t)||isNaN(a))return!1;switch(s){case"=":return t===a;case"!=":return t!==a;case">":return t>a;case">=":return t>=a;case"<":return t<a;case"<=":return t<=a;default:return!0}}function F(r,e){if(!r)return!1;const s=new Date(r);if(isNaN(s.getTime()))return!1;if(e.diffFlag&&e.startDate&&e.endDate){const t=new Date(e.startDate),a=new Date(e.endDate);return s>=t&&s<=a}if(e.startDate){const t=new Date(e.startDate);switch(e.comparator){case"=":return s.toDateString()===t.toDateString();case">=":return s>=t;case"<":return s<t;default:return s>=t}}return!0}export function exportToCSV(r,e,s){const t=e.filter(u=>u.csvExport!==!1),a=t.map(u=>`"${u.text}"`).join(","),i=r.map((u,x)=>t.map(m=>{const f=m.csvFormatter?m.csvFormatter(getNestedValue(u,m.dataField),u,x):getNestedValue(u,m.dataField);return f==null?'""':typeof f=="string"?`"${f.replace(/"/g,'""')}"`:typeof f=="object"?`"${JSON.stringify(f).replace(/"/g,'""')}"`:`"${f}"`}).join(",")),o=[a,...i].join(`
2
- `),n=new Blob([o],{type:"text/csv;charset=utf-8;"}),l=URL.createObjectURL(n),c=document.createElement("a");c.href=l,c.download=`${s}_${new Date().toISOString().slice(0,10)}.csv`,c.click(),URL.revokeObjectURL(l)}async function j(){return window.ExcelJS?window.ExcelJS:new Promise((r,e)=>{const s=document.createElement("script");s.src="https://cdn.jsdelivr.net/npm/exceljs@4.4.0/dist/exceljs.min.js",s.async=!0,s.onload=()=>r(window.ExcelJS),s.onerror=()=>e(new Error("Failed to load ExcelJS from CDN")),document.head.appendChild(s)})}export async function exportToExcel(r,e,s,t){try{const a=await j(),i=new a.Workbook,o=i.addWorksheet(t?.sheetName||"Sheet1"),n=e.filter(f=>f.csvExport!==!1);o.columns=n.map(f=>({header:f.text,key:f.dataField,width:Math.max(f.text.length+5,15)}));const l=o.getRow(1);l.font={bold:t?.headerStyle?.font?.bold??!0,size:t?.headerStyle?.font?.size??12},t?.headerStyle?.fill?.color&&(l.fill={type:"pattern",pattern:"solid",fgColor:{argb:t.headerStyle.fill.color.replace("#","")}}),l.commit(),r.forEach((f,w)=>{const d={};n.forEach(p=>{const h=p.csvFormatter?p.csvFormatter(getNestedValue(f,p.dataField),f,w):getNestedValue(f,p.dataField);h==null?d[p.dataField]="":typeof h=="object"?d[p.dataField]=JSON.stringify(h):d[p.dataField]=h}),o.addRow(d)});const c=await i.xlsx.writeBuffer(),u=new Blob([c],{type:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}),x=URL.createObjectURL(u),m=document.createElement("a");m.href=x,m.download=`${s}_${new Date().toISOString().slice(0,10)}.xlsx`,m.click(),URL.revokeObjectURL(x)}catch(a){console.error("Excel export failed:",a),console.warn("Falling back to CSV export"),exportToCSV(r,e,s)}}
1
+ import { useState, useCallback, useMemo, useEffect } from 'react';
2
+ /**
3
+ * Debounce function for table
4
+ */
5
+ export function useTableDebounce(value, delay) {
6
+ const [debouncedValue, setDebouncedValue] = useState(value);
7
+ useEffect(() => {
8
+ const handler = setTimeout(() => {
9
+ setDebouncedValue(value);
10
+ }, delay);
11
+ return () => clearTimeout(handler);
12
+ }, [value, delay]);
13
+ return debouncedValue;
14
+ }
15
+ /**
16
+ * Hook for managing sort state
17
+ */
18
+ export function useSortState(defaultSort, controlledSort, multiSort = false) {
19
+ const [internalSort, setInternalSort] = useState(defaultSort || { field: '', order: null });
20
+ const sort = controlledSort ?? internalSort;
21
+ const handleSort = useCallback((field, currentOrder) => {
22
+ let nextOrder;
23
+ if (sort.field !== field) {
24
+ nextOrder = 'asc';
25
+ }
26
+ else if (currentOrder === null) {
27
+ nextOrder = 'asc';
28
+ }
29
+ else if (currentOrder === 'asc') {
30
+ nextOrder = 'desc';
31
+ }
32
+ else {
33
+ nextOrder = null;
34
+ }
35
+ const newSort = { field, order: nextOrder };
36
+ setInternalSort(newSort);
37
+ return newSort;
38
+ }, [sort.field]);
39
+ return { sort, handleSort, setSort: setInternalSort };
40
+ }
41
+ /**
42
+ * Hook for managing filter state
43
+ */
44
+ export function useFilterState(defaultFilters, controlledFilters) {
45
+ const [internalFilters, setInternalFilters] = useState(defaultFilters || {});
46
+ const filters = controlledFilters ?? internalFilters;
47
+ const setFilter = useCallback((field, value) => {
48
+ setInternalFilters((prev) => {
49
+ if (value === undefined || value === null || value === '') {
50
+ const { [field]: _, ...rest } = prev;
51
+ return rest;
52
+ }
53
+ return { ...prev, [field]: value };
54
+ });
55
+ }, []);
56
+ const clearFilters = useCallback(() => {
57
+ setInternalFilters({});
58
+ }, []);
59
+ return { filters, setFilter, clearFilters, setFilters: setInternalFilters };
60
+ }
61
+ /**
62
+ * Hook for managing pagination state
63
+ */
64
+ export function usePaginationState(defaultPage = 0, defaultPageSize = 10, totalSize = 0) {
65
+ const [page, setPage] = useState(defaultPage);
66
+ const [pageSize, setPageSize] = useState(defaultPageSize);
67
+ const totalPages = Math.ceil(totalSize / pageSize) || 1;
68
+ const goToPage = useCallback((newPage) => {
69
+ const validPage = Math.max(0, Math.min(newPage, totalPages - 1));
70
+ setPage(validPage);
71
+ }, [totalPages]);
72
+ const goToNextPage = useCallback(() => {
73
+ goToPage(page + 1);
74
+ }, [page, goToPage]);
75
+ const goToPrevPage = useCallback(() => {
76
+ goToPage(page - 1);
77
+ }, [page, goToPage]);
78
+ const goToFirstPage = useCallback(() => {
79
+ goToPage(0);
80
+ }, [goToPage]);
81
+ const goToLastPage = useCallback(() => {
82
+ goToPage(totalPages - 1);
83
+ }, [totalPages, goToPage]);
84
+ const changePageSize = useCallback((newSize) => {
85
+ setPageSize(newSize);
86
+ setPage(0); // Reset to first page
87
+ }, []);
88
+ return {
89
+ page,
90
+ pageSize,
91
+ totalPages,
92
+ goToPage,
93
+ goToNextPage,
94
+ goToPrevPage,
95
+ goToFirstPage,
96
+ goToLastPage,
97
+ changePageSize,
98
+ setPage,
99
+ setPageSize,
100
+ };
101
+ }
102
+ /**
103
+ * Hook for managing row selection
104
+ */
105
+ export function useRowSelection(data, keyField = '_id', mode = 'none', controlledSelectedKeys, getCheckboxProps) {
106
+ const [internalSelected, setInternalSelected] = useState(new Set());
107
+ const selectedKeys = controlledSelectedKeys
108
+ ? new Set(controlledSelectedKeys)
109
+ : internalSelected;
110
+ const isSelected = useCallback((key) => selectedKeys.has(key), [selectedKeys]);
111
+ const toggleRow = useCallback((row) => {
112
+ const key = row[keyField];
113
+ const props = getCheckboxProps?.(row);
114
+ if (props?.disabled)
115
+ return;
116
+ if (mode === 'single') {
117
+ setInternalSelected(new Set([key]));
118
+ return { selectedKeys: [key], selectedRows: [row] };
119
+ }
120
+ setInternalSelected((prev) => {
121
+ const next = new Set(prev);
122
+ if (next.has(key)) {
123
+ next.delete(key);
124
+ }
125
+ else {
126
+ next.add(key);
127
+ }
128
+ return next;
129
+ });
130
+ const newSelected = selectedKeys.has(key)
131
+ ? Array.from(selectedKeys).filter((k) => k !== key)
132
+ : [...Array.from(selectedKeys), key];
133
+ return {
134
+ selectedKeys: newSelected,
135
+ selectedRows: data.filter((r) => newSelected.includes(r[keyField])),
136
+ };
137
+ }, [data, keyField, mode, selectedKeys, getCheckboxProps]);
138
+ const toggleAll = useCallback((selectAll) => {
139
+ if (selectAll) {
140
+ const selectableKeys = data
141
+ .filter((row) => {
142
+ const props = getCheckboxProps?.(row);
143
+ return !props?.disabled;
144
+ })
145
+ .map((row) => row[keyField]);
146
+ setInternalSelected(new Set(selectableKeys));
147
+ return {
148
+ selectedKeys: selectableKeys,
149
+ selectedRows: data.filter((r) => selectableKeys.includes(r[keyField])),
150
+ };
151
+ }
152
+ else {
153
+ setInternalSelected(new Set());
154
+ return { selectedKeys: [], selectedRows: [] };
155
+ }
156
+ }, [data, keyField, getCheckboxProps]);
157
+ const isAllSelected = useMemo(() => {
158
+ if (data.length === 0)
159
+ return false;
160
+ const selectableRows = data.filter((row) => {
161
+ const props = getCheckboxProps?.(row);
162
+ return !props?.disabled;
163
+ });
164
+ return selectableRows.every((row) => selectedKeys.has(row[keyField]));
165
+ }, [data, selectedKeys, keyField, getCheckboxProps]);
166
+ const isIndeterminate = useMemo(() => {
167
+ if (data.length === 0)
168
+ return false;
169
+ const selectableRows = data.filter((row) => {
170
+ const props = getCheckboxProps?.(row);
171
+ return !props?.disabled;
172
+ });
173
+ const selectedCount = selectableRows.filter((row) => selectedKeys.has(row[keyField])).length;
174
+ return selectedCount > 0 && selectedCount < selectableRows.length;
175
+ }, [data, selectedKeys, keyField, getCheckboxProps]);
176
+ const clearSelection = useCallback(() => {
177
+ setInternalSelected(new Set());
178
+ }, []);
179
+ return {
180
+ selectedKeys,
181
+ isSelected,
182
+ toggleRow,
183
+ toggleAll,
184
+ isAllSelected,
185
+ isIndeterminate,
186
+ clearSelection,
187
+ setSelected: setInternalSelected,
188
+ };
189
+ }
190
+ /**
191
+ * Hook for managing row expansion
192
+ */
193
+ export function useRowExpansion(keyField = '_id', defaultExpandedKeys, controlledExpandedKeys, accordion = false) {
194
+ const [internalExpanded, setInternalExpanded] = useState(new Set(defaultExpandedKeys || []));
195
+ const expandedKeys = controlledExpandedKeys
196
+ ? new Set(controlledExpandedKeys)
197
+ : internalExpanded;
198
+ const isExpanded = useCallback((key) => expandedKeys.has(key), [expandedKeys]);
199
+ const toggleExpand = useCallback((row) => {
200
+ const key = row[keyField];
201
+ setInternalExpanded((prev) => {
202
+ const next = accordion ? new Set() : new Set(prev);
203
+ if (prev.has(key)) {
204
+ next.delete(key);
205
+ }
206
+ else {
207
+ next.add(key);
208
+ }
209
+ return next;
210
+ });
211
+ const newExpanded = expandedKeys.has(key)
212
+ ? Array.from(expandedKeys).filter((k) => k !== key)
213
+ : accordion
214
+ ? [key]
215
+ : [...Array.from(expandedKeys), key];
216
+ return { expandedKeys: newExpanded, expanded: !expandedKeys.has(key), row };
217
+ }, [keyField, expandedKeys, accordion]);
218
+ return {
219
+ expandedKeys,
220
+ isExpanded,
221
+ toggleExpand,
222
+ setExpanded: setInternalExpanded,
223
+ };
224
+ }
225
+ /**
226
+ * Hook for managing column visibility
227
+ */
228
+ export function useColumnVisibility(columns, storageKey) {
229
+ const [hiddenColumns, setHiddenColumns] = useState(() => {
230
+ // Load from storage if available
231
+ if (storageKey && typeof window !== 'undefined') {
232
+ const stored = localStorage.getItem(`table_columns_${storageKey}`);
233
+ if (stored) {
234
+ try {
235
+ return new Set(JSON.parse(stored));
236
+ }
237
+ catch (e) {
238
+ // Ignore
239
+ }
240
+ }
241
+ }
242
+ return new Set(columns.filter((c) => c.hidden).map((c) => c.dataField));
243
+ });
244
+ const visibleColumns = useMemo(() => columns.filter((c) => !hiddenColumns.has(c.dataField)), [columns, hiddenColumns]);
245
+ const toggleColumn = useCallback((dataField) => {
246
+ setHiddenColumns((prev) => {
247
+ const next = new Set(prev);
248
+ if (next.has(dataField)) {
249
+ next.delete(dataField);
250
+ }
251
+ else {
252
+ next.add(dataField);
253
+ }
254
+ // Save to storage
255
+ if (storageKey && typeof window !== 'undefined') {
256
+ localStorage.setItem(`table_columns_${storageKey}`, JSON.stringify(Array.from(next)));
257
+ }
258
+ return next;
259
+ });
260
+ }, [storageKey]);
261
+ const showAllColumns = useCallback(() => {
262
+ setHiddenColumns(new Set());
263
+ if (storageKey && typeof window !== 'undefined') {
264
+ localStorage.removeItem(`table_columns_${storageKey}`);
265
+ }
266
+ }, [storageKey]);
267
+ return {
268
+ hiddenColumns,
269
+ visibleColumns,
270
+ toggleColumn,
271
+ showAllColumns,
272
+ isColumnHidden: (field) => hiddenColumns.has(field),
273
+ };
274
+ }
275
+ /**
276
+ * Sort data locally
277
+ */
278
+ export function sortData(data, sort, columns) {
279
+ if (!sort.field || !sort.order)
280
+ return data;
281
+ const column = columns.find((c) => c.dataField === sort.field);
282
+ if (!column)
283
+ return data;
284
+ const sorted = [...data].sort((a, b) => {
285
+ const aVal = getNestedValue(a, sort.field);
286
+ const bVal = getNestedValue(b, sort.field);
287
+ if (column.sortFunc) {
288
+ return column.sortFunc(aVal, bVal, sort.order, a, b);
289
+ }
290
+ // Default sorting
291
+ if (aVal === bVal)
292
+ return 0;
293
+ if (aVal === null || aVal === undefined)
294
+ return 1;
295
+ if (bVal === null || bVal === undefined)
296
+ return -1;
297
+ const comparison = typeof aVal === 'string'
298
+ ? aVal.localeCompare(bVal)
299
+ : aVal < bVal
300
+ ? -1
301
+ : 1;
302
+ return sort.order === 'asc' ? comparison : -comparison;
303
+ });
304
+ return sorted;
305
+ }
306
+ /**
307
+ * Filter data locally
308
+ */
309
+ export function filterData(data, filters, columns, searchValue) {
310
+ let filtered = data;
311
+ // Apply column filters
312
+ for (const [field, value] of Object.entries(filters)) {
313
+ if (value === undefined || value === null || value === '')
314
+ continue;
315
+ const column = columns.find((c) => c.dataField === field);
316
+ if (!column)
317
+ continue;
318
+ filtered = filtered.filter((row) => {
319
+ const cellValue = getNestedValue(row, field);
320
+ if (typeof value === 'object' && value !== null) {
321
+ // Complex filter (number range, date range, etc.)
322
+ if ('number' in value && 'comparator' in value) {
323
+ return compareNumber(cellValue, value.number, value.comparator);
324
+ }
325
+ if ('startDate' in value) {
326
+ return compareDateRange(cellValue, value);
327
+ }
328
+ return true;
329
+ }
330
+ // Simple text filter
331
+ if (cellValue === null || cellValue === undefined)
332
+ return false;
333
+ return String(cellValue)
334
+ .toLowerCase()
335
+ .includes(String(value).toLowerCase());
336
+ });
337
+ }
338
+ // Apply global search
339
+ if (searchValue) {
340
+ const searchLower = searchValue.toLowerCase();
341
+ filtered = filtered.filter((row) => {
342
+ return columns.some((column) => {
343
+ const value = getNestedValue(row, column.dataField);
344
+ if (value === null || value === undefined)
345
+ return false;
346
+ return String(value).toLowerCase().includes(searchLower);
347
+ });
348
+ });
349
+ }
350
+ return filtered;
351
+ }
352
+ /**
353
+ * Paginate data locally
354
+ */
355
+ export function paginateData(data, page, pageSize) {
356
+ const start = page * pageSize;
357
+ return data.slice(start, start + pageSize);
358
+ }
359
+ /**
360
+ * Get nested value from object
361
+ */
362
+ export function getNestedValue(obj, path) {
363
+ return path.split('.').reduce((acc, part) => acc?.[part], obj);
364
+ }
365
+ /**
366
+ * Compare numbers with comparator
367
+ */
368
+ function compareNumber(value, filterValue, comparator) {
369
+ const num = parseFloat(value);
370
+ const filterNum = parseFloat(filterValue);
371
+ if (isNaN(num) || isNaN(filterNum))
372
+ return false;
373
+ switch (comparator) {
374
+ case '=':
375
+ return num === filterNum;
376
+ case '!=':
377
+ return num !== filterNum;
378
+ case '>':
379
+ return num > filterNum;
380
+ case '>=':
381
+ return num >= filterNum;
382
+ case '<':
383
+ return num < filterNum;
384
+ case '<=':
385
+ return num <= filterNum;
386
+ default:
387
+ return true;
388
+ }
389
+ }
390
+ /**
391
+ * Compare date range
392
+ */
393
+ function compareDateRange(value, filter) {
394
+ if (!value)
395
+ return false;
396
+ const date = new Date(value);
397
+ if (isNaN(date.getTime()))
398
+ return false;
399
+ if (filter.diffFlag && filter.startDate && filter.endDate) {
400
+ const start = new Date(filter.startDate);
401
+ const end = new Date(filter.endDate);
402
+ return date >= start && date <= end;
403
+ }
404
+ if (filter.startDate) {
405
+ const start = new Date(filter.startDate);
406
+ switch (filter.comparator) {
407
+ case '=':
408
+ return date.toDateString() === start.toDateString();
409
+ case '>=':
410
+ return date >= start;
411
+ case '<':
412
+ return date < start;
413
+ default:
414
+ return date >= start;
415
+ }
416
+ }
417
+ return true;
418
+ }
419
+ /**
420
+ * Export data to CSV
421
+ */
422
+ export function exportToCSV(data, columns, fileName) {
423
+ const exportColumns = columns.filter((c) => c.csvExport !== false);
424
+ // Header row
425
+ const header = exportColumns.map((c) => `"${c.text}"`).join(',');
426
+ // Data rows
427
+ const rows = data.map((row, rowIndex) => {
428
+ return exportColumns
429
+ .map((col) => {
430
+ const value = col.csvFormatter
431
+ ? col.csvFormatter(getNestedValue(row, col.dataField), row, rowIndex)
432
+ : getNestedValue(row, col.dataField);
433
+ if (value === null || value === undefined)
434
+ return '""';
435
+ if (typeof value === 'string')
436
+ return `"${value.replace(/"/g, '""')}"`;
437
+ if (typeof value === 'object')
438
+ return `"${JSON.stringify(value).replace(/"/g, '""')}"`;
439
+ return `"${value}"`;
440
+ })
441
+ .join(',');
442
+ });
443
+ const csv = [header, ...rows].join('\n');
444
+ const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });
445
+ const url = URL.createObjectURL(blob);
446
+ const link = document.createElement('a');
447
+ link.href = url;
448
+ link.download = `${fileName}_${new Date().toISOString().slice(0, 10)}.csv`;
449
+ link.click();
450
+ URL.revokeObjectURL(url);
451
+ }
452
+ /**
453
+ * Dynamically load ExcelJS from CDN (no bundle impact)
454
+ */
455
+ async function loadExcelJS() {
456
+ // Check if already loaded
457
+ if (window.ExcelJS) {
458
+ return window.ExcelJS;
459
+ }
460
+ return new Promise((resolve, reject) => {
461
+ const script = document.createElement('script');
462
+ script.src =
463
+ 'https://cdn.jsdelivr.net/npm/exceljs@4.4.0/dist/exceljs.min.js';
464
+ script.async = true;
465
+ script.onload = () => resolve(window.ExcelJS);
466
+ script.onerror = () => reject(new Error('Failed to load ExcelJS from CDN'));
467
+ document.head.appendChild(script);
468
+ });
469
+ }
470
+ /**
471
+ * Export data to Excel (.xlsx) - loads ExcelJS dynamically from CDN
472
+ */
473
+ export async function exportToExcel(data, columns, fileName, options) {
474
+ try {
475
+ const ExcelJS = await loadExcelJS();
476
+ const workbook = new ExcelJS.Workbook();
477
+ const worksheet = workbook.addWorksheet(options?.sheetName || 'Sheet1');
478
+ const exportColumns = columns.filter((c) => c.csvExport !== false);
479
+ // Set up columns with headers
480
+ worksheet.columns = exportColumns.map((col) => ({
481
+ header: col.text,
482
+ key: col.dataField,
483
+ width: Math.max(col.text.length + 5, 15),
484
+ }));
485
+ // Style header row
486
+ const headerRow = worksheet.getRow(1);
487
+ headerRow.font = {
488
+ bold: options?.headerStyle?.font?.bold ?? true,
489
+ size: options?.headerStyle?.font?.size ?? 12,
490
+ };
491
+ if (options?.headerStyle?.fill?.color) {
492
+ headerRow.fill = {
493
+ type: 'pattern',
494
+ pattern: 'solid',
495
+ fgColor: { argb: options.headerStyle.fill.color.replace('#', '') },
496
+ };
497
+ }
498
+ headerRow.commit();
499
+ // Add data rows
500
+ data.forEach((row, rowIndex) => {
501
+ const rowData = {};
502
+ exportColumns.forEach((col) => {
503
+ const value = col.csvFormatter
504
+ ? col.csvFormatter(getNestedValue(row, col.dataField), row, rowIndex)
505
+ : getNestedValue(row, col.dataField);
506
+ if (value === null || value === undefined) {
507
+ rowData[col.dataField] = '';
508
+ }
509
+ else if (typeof value === 'object') {
510
+ rowData[col.dataField] = JSON.stringify(value);
511
+ }
512
+ else {
513
+ rowData[col.dataField] = value;
514
+ }
515
+ });
516
+ worksheet.addRow(rowData);
517
+ });
518
+ // Generate and download
519
+ const buffer = await workbook.xlsx.writeBuffer();
520
+ const blob = new Blob([buffer], {
521
+ type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
522
+ });
523
+ const url = URL.createObjectURL(blob);
524
+ const link = document.createElement('a');
525
+ link.href = url;
526
+ link.download = `${fileName}_${new Date().toISOString().slice(0, 10)}.xlsx`;
527
+ link.click();
528
+ URL.revokeObjectURL(url);
529
+ }
530
+ catch (error) {
531
+ console.error('Excel export failed:', error);
532
+ // Fallback to CSV if Excel export fails
533
+ console.warn('Falling back to CSV export');
534
+ exportToCSV(data, columns, fileName);
535
+ }
536
+ }
@@ -3,3 +3,7 @@ export * from './types';
3
3
  export { useSortState, useFilterState, usePaginationState, useRowSelection, useRowExpansion, useColumnVisibility, useTableDebounce, sortData, filterData, paginateData, getNestedValue, exportToCSV, exportToExcel, } from './hooks';
4
4
  export { TextFilter, NumberFilter, DateFilter, SelectFilter, getFilterComponent, } from './filters';
5
5
  export type { TextFilterOptions, TextFilterInstance, NumberFilterOptions, NumberFilterInstance, SelectFilterOptions, SelectFilterInstance, DateFilterOptions, DateFilterInstance, } from './filters';
6
+ export { useColumnResize, getColumnStyle, ResizeHandle, ResizeLine, ResizableHeaderCell, } from './columnResize';
7
+ export type { ColumnResizeConfig, UseColumnResizeReturn } from './columnResize';
8
+ export { useColumnReorder, DragGhost, DropIndicator, DraggableHeader, ColumnReorderGhost, ColumnDropIndicator, getReorderableHeaderProps, } from './columnReorder';
9
+ export type { ColumnReorderConfig, UseColumnReorderReturn } from './columnReorder';
@@ -1 +1,6 @@
1
- "use strict";export{Table,default}from"./Table";export*from"./types";export{useSortState,useFilterState,usePaginationState,useRowSelection,useRowExpansion,useColumnVisibility,useTableDebounce,sortData,filterData,paginateData,getNestedValue,exportToCSV,exportToExcel}from"./hooks";export{TextFilter,NumberFilter,DateFilter,SelectFilter,getFilterComponent}from"./filters";
1
+ export { Table, default } from './Table';
2
+ export * from './types';
3
+ export { useSortState, useFilterState, usePaginationState, useRowSelection, useRowExpansion, useColumnVisibility, useTableDebounce, sortData, filterData, paginateData, getNestedValue, exportToCSV, exportToExcel, } from './hooks';
4
+ export { TextFilter, NumberFilter, DateFilter, SelectFilter, getFilterComponent, } from './filters';
5
+ export { useColumnResize, getColumnStyle, ResizeHandle, ResizeLine, ResizableHeaderCell, } from './columnResize';
6
+ export { useColumnReorder, DragGhost, DropIndicator, DraggableHeader, ColumnReorderGhost, ColumnDropIndicator, getReorderableHeaderProps, } from './columnReorder';
@@ -658,4 +658,62 @@ export interface TableProps<T = any> {
658
658
  rowSelected?: string;
659
659
  rowExpanded?: string;
660
660
  };
661
+ /**
662
+ * Enable column resizing via drag handle
663
+ * @default true
664
+ */
665
+ resizable?: boolean;
666
+ /**
667
+ * Column resize configuration
668
+ * Only used when resizable={true}
669
+ */
670
+ resizeConfig?: {
671
+ /** Minimum column width in pixels (default: 50) */
672
+ minWidth?: number;
673
+ /** Maximum column width in pixels (default: 800) */
674
+ maxWidth?: number;
675
+ /** Enable double-click to auto-fit width (default: true) */
676
+ autoFit?: boolean;
677
+ /** Callback when column is resized */
678
+ onResize?: (columnWidths: Record<string, number>) => void;
679
+ /** Callback when resize starts */
680
+ onResizeStart?: (dataField: string, width: number) => void;
681
+ /** Callback when resize ends */
682
+ onResizeEnd?: (dataField: string, width: number) => void;
683
+ /** Initial column widths */
684
+ defaultWidths?: Record<string, number>;
685
+ /** Handle color */
686
+ handleColor?: string;
687
+ /** Handle hover color */
688
+ handleHoverColor?: string;
689
+ /** Handle width in pixels (default: 4) */
690
+ handleWidth?: number;
691
+ };
692
+ /**
693
+ * Enable column reordering via long press and drag
694
+ * @default true
695
+ */
696
+ reorderable?: boolean;
697
+ /**
698
+ * Column reorder configuration
699
+ * Only used when reorderable={true}
700
+ */
701
+ reorderConfig?: {
702
+ /** Long press delay in ms before drag starts (default: 200) */
703
+ longPressDelay?: number;
704
+ /** Callback when columns are reordered */
705
+ onReorder?: (newColumns: TableColumn<T>[], fromIndex: number, toIndex: number) => void;
706
+ /** Callback when drag starts */
707
+ onDragStart?: (column: TableColumn<T>, index: number) => void;
708
+ /** Callback when drag ends */
709
+ onDragEnd?: (column: TableColumn<T>, index: number) => void;
710
+ /** Disable specific columns from being dragged */
711
+ disabledColumns?: string[];
712
+ /** Ghost element opacity (default: 0.8) */
713
+ ghostOpacity?: number;
714
+ /** Drop indicator color */
715
+ dropIndicatorColor?: string;
716
+ /** Enable animation (default: true) */
717
+ animated?: boolean;
718
+ };
661
719
  }
@@ -1 +1 @@
1
- "use strict";export{};
1
+ export {};
@@ -1 +1,22 @@
1
- "use strict";import{jsx as i,jsxs as h,Fragment as x}from"react/jsx-runtime";import s,{useState as m}from"react";import t from"../../tc.module.css";import{cn as l}from"../../utils";export const Tab=({title:n,children:d,className:b,style:o})=>i("div",{className:l(t.flex,b),style:o,children:d},n),Tabs=({options:n,onSelect:d,children:b,classNames:o={},styles:c={}})=>{const[a,u]=m(0),[f,v]=m(n[0].title),p=s.Children.toArray(b).filter(e=>s.isValidElement(e)&&e.type===Tab);return i(x,{children:h("div",{className:l(t.flex,t["flex-col"],t["w-full"],o.container),style:c.container,children:[i("div",{className:l(t.flex,t["border-b"],o.tabsHeader),style:c.tabsHeader,children:n?.map((e,r)=>i("button",{type:"button",className:l(t["py-2"],t["px-4"],t["mr-1"],t["border-none"],t["rounded-t-md"],t["shadow-inner"],t["cursor-pointer"],a===r&&t["bg-blue-500"],a===r&&t["border-none"],a===r&&t["text-white"],o.tabButton,a===r&&o.activeTabButton),style:{...c.tabButton,...a===r?c.activeTabButton:{}},onClick:()=>{v(e?.title),d&&d(e,r),!e.inActive&&u(r)},disabled:e.inActive,children:e.title},r))}),i("div",{className:l(t["p-2"],t.border,t["border-solid"],t["border-slate-600"],t["rounded-b-md"],o.contentContainer),style:c.contentContainer,children:n[a]?.content?n[a]?.content:p[n?.findIndex(e=>e.title===f)]})]})})};
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import React, { useState } from 'react';
3
+ import s from '../../tc.module.css';
4
+ import { cn } from '../../utils';
5
+ export const Tab = ({ title, children, className, style }) => {
6
+ return (_jsx("div", { className: cn(s.flex, className), style: style, children: children }, title));
7
+ };
8
+ export const Tabs = ({ options, onSelect, children, classNames = {}, styles = {}, }) => {
9
+ const [activeTab, setActiveTab] = useState(0);
10
+ const [selected, setSelected] = useState(options[0].title);
11
+ const tabs = React.Children.toArray(children).filter((child) => React.isValidElement(child) && child.type === Tab);
12
+ return (_jsx(_Fragment, { children: _jsxs("div", { className: cn(s.flex, s['flex-col'], s['w-full'], classNames.container), style: styles.container, children: [_jsx("div", { className: cn(s.flex, s['border-b'], classNames.tabsHeader), style: styles.tabsHeader, children: options?.map((tab, index) => (_jsx("button", { type: "button", className: cn(s['py-2'], s['px-4'], s['mr-1'], s['border-none'], s['rounded-t-md'], s['shadow-inner'], s['cursor-pointer'], activeTab === index && s['bg-blue-500'], activeTab === index && s['border-none'], activeTab === index && s['text-white'], classNames.tabButton, activeTab === index && classNames.activeTabButton), style: {
13
+ ...styles.tabButton,
14
+ ...(activeTab === index ? styles.activeTabButton : {}),
15
+ }, onClick: () => {
16
+ setSelected(tab?.title);
17
+ onSelect && onSelect(tab, index);
18
+ !tab.inActive && setActiveTab(index);
19
+ }, disabled: tab.inActive, children: tab.title }, index))) }), _jsx("div", { className: cn(s['p-2'], s.border, s['border-solid'], s['border-slate-600'], s['rounded-b-md'], classNames.contentContainer), style: styles.contentContainer, children: options[activeTab]?.content
20
+ ? options[activeTab]?.content
21
+ : tabs[options?.findIndex((item) => item.title === selected)] })] }) }));
22
+ };