@withwiz/toolkit 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (380) hide show
  1. package/README.md +162 -0
  2. package/dist/auth/adapters/prisma/index.d.ts +43 -0
  3. package/dist/auth/adapters/prisma/index.js +284 -0
  4. package/dist/auth/core/email/token-generator.d.ts +43 -0
  5. package/dist/auth/core/email/token-generator.js +7 -0
  6. package/dist/auth/core/jwt/client.d.ts +87 -0
  7. package/dist/auth/core/jwt/client.js +36 -0
  8. package/dist/auth/core/jwt/index.d.ts +110 -0
  9. package/dist/auth/core/jwt/index.js +10 -0
  10. package/dist/auth/core/jwt/types.d.ts +6 -0
  11. package/dist/auth/core/jwt/types.js +13 -0
  12. package/dist/auth/core/oauth/index.d.ts +51 -0
  13. package/dist/auth/core/oauth/index.js +12 -0
  14. package/dist/auth/core/password/client-helper.d.ts +44 -0
  15. package/dist/auth/core/password/client-helper.js +28 -0
  16. package/dist/auth/core/password/index.d.ts +71 -0
  17. package/dist/auth/core/password/index.js +14 -0
  18. package/dist/auth/errors/index.d.ts +49 -0
  19. package/dist/auth/errors/index.js +17 -0
  20. package/dist/auth/index.d.ts +21 -0
  21. package/dist/auth/index.js +97 -0
  22. package/dist/auth/types/index.d.ts +213 -0
  23. package/dist/auth/types/index.js +13 -0
  24. package/dist/cache/cache-config.d.ts +73 -0
  25. package/dist/cache/cache-config.js +12 -0
  26. package/dist/cache/cache-defaults.d.ts +141 -0
  27. package/dist/cache/cache-defaults.js +33 -0
  28. package/dist/cache/cache-env.d.ts +75 -0
  29. package/dist/cache/cache-env.js +25 -0
  30. package/dist/cache/cache-factory.d.ts +34 -0
  31. package/dist/cache/cache-factory.js +28 -0
  32. package/dist/cache/cache-invalidation.d.ts +90 -0
  33. package/dist/cache/cache-invalidation.js +24 -0
  34. package/dist/cache/cache-keys-legacy.d.ts +35 -0
  35. package/dist/cache/cache-keys-legacy.js +7 -0
  36. package/dist/cache/cache-redis.d.ts +74 -0
  37. package/dist/cache/cache-redis.js +24 -0
  38. package/dist/cache/cache-types.d.ts +151 -0
  39. package/dist/cache/cache-types.js +9 -0
  40. package/dist/cache/cache-wrapper.d.ts +27 -0
  41. package/dist/cache/cache-wrapper.js +22 -0
  42. package/dist/cache/cache.d.ts +14 -0
  43. package/dist/cache/cache.js +112 -0
  44. package/dist/cache/hybrid-cache-manager.d.ts +148 -0
  45. package/dist/cache/hybrid-cache-manager.js +13 -0
  46. package/dist/cache/index.d.ts +21 -0
  47. package/dist/cache/index.js +112 -0
  48. package/dist/cache/inmemory-cache-manager.d.ts +163 -0
  49. package/dist/cache/inmemory-cache-manager.js +9 -0
  50. package/dist/cache/noop-cache-manager.d.ts +36 -0
  51. package/dist/cache/noop-cache-manager.js +11 -0
  52. package/dist/cache/redis-cache-manager.d.ts +34 -0
  53. package/dist/cache/redis-cache-manager.js +11 -0
  54. package/dist/chunk-26Y7VEYG.js +93 -0
  55. package/dist/chunk-2DVWSDST.js +119 -0
  56. package/dist/chunk-2KAPUVIS.js +155 -0
  57. package/dist/chunk-2TO7WUKK.js +93 -0
  58. package/dist/chunk-34WAGUT5.js +117 -0
  59. package/dist/chunk-3DZA6AGS.js +120 -0
  60. package/dist/chunk-4DPSCTX4.js +212 -0
  61. package/dist/chunk-4KJXENRM.js +64 -0
  62. package/dist/chunk-4NWJ3WCZ.js +28 -0
  63. package/dist/chunk-4ODT3Q4A.js +86 -0
  64. package/dist/chunk-5ATB5D6S.js +40 -0
  65. package/dist/chunk-62FLBG6B.js +34 -0
  66. package/dist/chunk-62Q7DN5G.js +25 -0
  67. package/dist/chunk-65LHDFU3.js +242 -0
  68. package/dist/chunk-6C7HQIX4.js +13 -0
  69. package/dist/chunk-6D3HHYER.js +32 -0
  70. package/dist/chunk-6LTZCXNC.js +326 -0
  71. package/dist/chunk-7VJNLGAS.js +110 -0
  72. package/dist/chunk-7XFHGAJP.js +0 -0
  73. package/dist/chunk-A6EAAWMK.js +50 -0
  74. package/dist/chunk-AHDPGRXS.js +51 -0
  75. package/dist/chunk-AIH3F7JV.js +76 -0
  76. package/dist/chunk-AIHQBQ3E.js +109 -0
  77. package/dist/chunk-BKGVSC6S.js +152 -0
  78. package/dist/chunk-COK4ZXNG.js +0 -0
  79. package/dist/chunk-DEEJBDJE.js +47 -0
  80. package/dist/chunk-DH2ZHGW2.js +53 -0
  81. package/dist/chunk-EBUEBEJX.js +0 -0
  82. package/dist/chunk-EEUBKZV4.js +54 -0
  83. package/dist/chunk-EQYTE7WD.js +139 -0
  84. package/dist/chunk-EUQATJLI.js +180 -0
  85. package/dist/chunk-EZC6ETFW.js +80 -0
  86. package/dist/chunk-EZR55KV2.js +249 -0
  87. package/dist/chunk-F6LCSFSU.js +31 -0
  88. package/dist/chunk-FOKAATUQ.js +62 -0
  89. package/dist/chunk-FW3IEJ7H.js +71 -0
  90. package/dist/chunk-G26T2PRQ.js +53 -0
  91. package/dist/chunk-G4NI37NN.js +257 -0
  92. package/dist/chunk-GCZOXUDV.js +132 -0
  93. package/dist/chunk-GDWEDUHO.js +55 -0
  94. package/dist/chunk-GL2NANFH.js +434 -0
  95. package/dist/chunk-GPBOMJSZ.js +136 -0
  96. package/dist/chunk-H5I5GWAA.js +94 -0
  97. package/dist/chunk-HGC4CCKB.js +29 -0
  98. package/dist/chunk-HV3DGSSH.js +447 -0
  99. package/dist/chunk-I47QEDTX.js +193 -0
  100. package/dist/chunk-IAJNC34M.js +102 -0
  101. package/dist/chunk-IHXRF3BH.js +215 -0
  102. package/dist/chunk-IJEZ7G7S.js +26 -0
  103. package/dist/chunk-IQQKKUAV.js +151 -0
  104. package/dist/chunk-JBCDEAMW.js +35 -0
  105. package/dist/chunk-JLLMTTQ4.js +75 -0
  106. package/dist/chunk-JS5VI3OW.js +143 -0
  107. package/dist/chunk-KAWVMIRJ.js +44 -0
  108. package/dist/chunk-KMCJIL57.js +214 -0
  109. package/dist/chunk-KWTBD4CM.js +145 -0
  110. package/dist/chunk-KXAWBFJN.js +310 -0
  111. package/dist/chunk-L25BNU3E.js +56 -0
  112. package/dist/chunk-L76O3X3D.js +197 -0
  113. package/dist/chunk-LNV2E4I6.js +63 -0
  114. package/dist/chunk-MLGO3HLS.js +329 -0
  115. package/dist/chunk-MRJE6OX5.js +22 -0
  116. package/dist/chunk-MYLGYX4K.js +57 -0
  117. package/dist/chunk-N4YGR5WH.js +310 -0
  118. package/dist/chunk-OIVXOT2X.js +80 -0
  119. package/dist/chunk-ORMEWXMH.js +37 -0
  120. package/dist/chunk-POKGHK3L.js +57 -0
  121. package/dist/chunk-Q7IP4JMW.js +69 -0
  122. package/dist/chunk-RJUVBBZG.js +27 -0
  123. package/dist/chunk-S73334QY.js +89 -0
  124. package/dist/chunk-SLG26KHZ.js +101 -0
  125. package/dist/chunk-SR65BF6X.js +82 -0
  126. package/dist/chunk-SS56XFLI.js +19 -0
  127. package/dist/chunk-T3LJYAMO.js +277 -0
  128. package/dist/chunk-TDZJ6SAI.js +34 -0
  129. package/dist/chunk-TEIYA7U4.js +72 -0
  130. package/dist/chunk-TMVS4F7E.js +88 -0
  131. package/dist/chunk-TRBKJ7JT.js +137 -0
  132. package/dist/chunk-TXGNSECL.js +84 -0
  133. package/dist/chunk-TZAP5T4N.js +188 -0
  134. package/dist/chunk-UCYQNHST.js +24 -0
  135. package/dist/chunk-ULF5RDDX.js +0 -0
  136. package/dist/chunk-UXQRU3EM.js +167 -0
  137. package/dist/chunk-V5K5FYU7.js +200 -0
  138. package/dist/chunk-VDXB5DCY.js +68 -0
  139. package/dist/chunk-VSGKVZB4.js +47 -0
  140. package/dist/chunk-VWODEQ5C.js +204 -0
  141. package/dist/chunk-WDUFQFDP.js +193 -0
  142. package/dist/chunk-WHR7HPWF.js +126 -0
  143. package/dist/chunk-WSQMXMTL.js +122 -0
  144. package/dist/chunk-XHZ5L4FO.js +103 -0
  145. package/dist/chunk-XPASCCUA.js +404 -0
  146. package/dist/chunk-XRRPEBKB.js +231 -0
  147. package/dist/chunk-Y2TUZFCP.js +0 -0
  148. package/dist/chunk-Y3OTJH2S.js +473 -0
  149. package/dist/chunk-YBSHN67U.js +161 -0
  150. package/dist/chunk-YJ3TLEW3.js +100 -0
  151. package/dist/chunk-YJWLWUFK.js +105 -0
  152. package/dist/chunk-Z4D4CMDA.js +488 -0
  153. package/dist/chunk-ZHVUK5OY.js +314 -0
  154. package/dist/chunk-ZTN4X5FN.js +29 -0
  155. package/dist/chunk-ZZIKRBJU.js +96 -0
  156. package/dist/components/ui/Alert.d.ts +12 -0
  157. package/dist/components/ui/Alert.js +10 -0
  158. package/dist/components/ui/Badge.d.ts +7 -0
  159. package/dist/components/ui/Badge.js +8 -0
  160. package/dist/components/ui/Button.d.ts +7 -0
  161. package/dist/components/ui/Button.js +8 -0
  162. package/dist/components/ui/DataTable.d.ts +103 -0
  163. package/dist/components/ui/DataTable.js +606 -0
  164. package/dist/components/ui/DomainDisplay.d.ts +12 -0
  165. package/dist/components/ui/DomainDisplay.js +31 -0
  166. package/dist/components/ui/Input.d.ts +5 -0
  167. package/dist/components/ui/Input.js +8 -0
  168. package/dist/components/ui/Label.d.ts +5 -0
  169. package/dist/components/ui/Label.js +8 -0
  170. package/dist/components/ui/Pagination.d.ts +42 -0
  171. package/dist/components/ui/Pagination.js +20 -0
  172. package/dist/components/ui/Select.d.ts +15 -0
  173. package/dist/components/ui/Select.js +27 -0
  174. package/dist/components/ui/Skeleton.d.ts +6 -0
  175. package/dist/components/ui/Skeleton.js +8 -0
  176. package/dist/components/ui/TimezoneDisplay.d.ts +22 -0
  177. package/dist/components/ui/TimezoneDisplay.js +83 -0
  178. package/dist/components/ui/Tooltip.d.ts +21 -0
  179. package/dist/components/ui/Tooltip.js +94 -0
  180. package/dist/components/ui/WorldMapChart.d.ts +17 -0
  181. package/dist/components/ui/WorldMapChart.js +250 -0
  182. package/dist/components/ui/loading-bar.d.ts +20 -0
  183. package/dist/components/ui/loading-bar.js +15 -0
  184. package/dist/constants/error-codes.d.ts +389 -0
  185. package/dist/constants/error-codes.js +27 -0
  186. package/dist/constants/index.d.ts +11 -0
  187. package/dist/constants/index.js +85 -0
  188. package/dist/constants/messages.d.ts +83 -0
  189. package/dist/constants/messages.js +13 -0
  190. package/dist/constants/pagination.d.ts +43 -0
  191. package/dist/constants/pagination.js +15 -0
  192. package/dist/constants/security.d.ts +66 -0
  193. package/dist/constants/security.js +23 -0
  194. package/dist/constants/validation.d.ts +60 -0
  195. package/dist/constants/validation.js +19 -0
  196. package/dist/error/ErrorBoundary.d.ts +47 -0
  197. package/dist/error/app-error.d.ts +144 -0
  198. package/dist/error/app-error.js +10 -0
  199. package/dist/error/components/EmptyState.d.ts +50 -0
  200. package/dist/error/components/ErrorAlert.d.ts +50 -0
  201. package/dist/error/components/ErrorPage.d.ts +39 -0
  202. package/dist/error/components/LoadingState.d.ts +37 -0
  203. package/dist/error/components/index.d.ts +13 -0
  204. package/dist/error/components/index.js +18 -0
  205. package/dist/error/core/locale-detector.d.ts +44 -0
  206. package/dist/error/core/locale-detector.js +9 -0
  207. package/dist/error/error-display.d.ts +55 -0
  208. package/dist/error/error-display.js +24 -0
  209. package/dist/error/error-handler.d.ts +118 -0
  210. package/dist/error/error-handler.js +18 -0
  211. package/dist/error/friendly-messages-v2.d.ts +46 -0
  212. package/dist/error/friendly-messages-v2.js +15 -0
  213. package/dist/error/friendly-messages.d.ts +22 -0
  214. package/dist/error/friendly-messages.js +12 -0
  215. package/dist/error/hooks/index.d.ts +7 -0
  216. package/dist/error/hooks/index.js +14 -0
  217. package/dist/error/hooks/useErrorHandler.d.ts +67 -0
  218. package/dist/error/hooks/useErrorHandler.js +14 -0
  219. package/dist/error/index.d.ts +26 -0
  220. package/dist/error/index.js +289 -0
  221. package/dist/error/logging/error-logger.d.ts +77 -0
  222. package/dist/error/logging/error-logger.js +10 -0
  223. package/dist/error/logging/index.d.ts +9 -0
  224. package/dist/error/logging/index.js +35 -0
  225. package/dist/error/logging/transports/base.d.ts +30 -0
  226. package/dist/error/logging/transports/base.js +7 -0
  227. package/dist/error/logging/transports/console.d.ts +40 -0
  228. package/dist/error/logging/transports/console.js +9 -0
  229. package/dist/error/logging/transports/file.d.ts +49 -0
  230. package/dist/error/logging/transports/file.js +8 -0
  231. package/dist/error/logging/transports/index.d.ts +12 -0
  232. package/dist/error/logging/transports/index.js +25 -0
  233. package/dist/error/logging/transports/sentry.d.ts +44 -0
  234. package/dist/error/logging/transports/sentry.js +9 -0
  235. package/dist/error/logging/transports/slack.d.ts +51 -0
  236. package/dist/error/logging/transports/slack.js +9 -0
  237. package/dist/error/logging/types.d.ts +83 -0
  238. package/dist/error/logging/types.js +7 -0
  239. package/dist/error/messages/en.d.ts +5 -0
  240. package/dist/error/messages/en.js +7 -0
  241. package/dist/error/messages/index.d.ts +40 -0
  242. package/dist/error/messages/index.js +17 -0
  243. package/dist/error/messages/ko.d.ts +5 -0
  244. package/dist/error/messages/ko.js +7 -0
  245. package/dist/error/messages/types.d.ts +30 -0
  246. package/dist/error/messages/types.js +0 -0
  247. package/dist/error/recovery/circuit-breaker.d.ts +85 -0
  248. package/dist/error/recovery/circuit-breaker.js +9 -0
  249. package/dist/error/recovery/degradation.d.ts +56 -0
  250. package/dist/error/recovery/degradation.js +7 -0
  251. package/dist/error/recovery/fallback.d.ts +55 -0
  252. package/dist/error/recovery/fallback.js +11 -0
  253. package/dist/error/recovery/index.d.ts +12 -0
  254. package/dist/error/recovery/index.js +26 -0
  255. package/dist/error/recovery/retry.d.ts +44 -0
  256. package/dist/error/recovery/retry.js +7 -0
  257. package/dist/geolocation/batch-processor.d.ts +33 -0
  258. package/dist/geolocation/batch-processor.js +10 -0
  259. package/dist/geolocation/index.d.ts +14 -0
  260. package/dist/geolocation/index.js +36 -0
  261. package/dist/geolocation/providers/base-provider.d.ts +33 -0
  262. package/dist/geolocation/providers/base-provider.js +9 -0
  263. package/dist/geolocation/providers/index.d.ts +54 -0
  264. package/dist/geolocation/providers/index.js +29 -0
  265. package/dist/geolocation/providers/ip-api-provider.d.ts +17 -0
  266. package/dist/geolocation/providers/ip-api-provider.js +8 -0
  267. package/dist/geolocation/providers/ipapi-co-provider.d.ts +17 -0
  268. package/dist/geolocation/providers/ipapi-co-provider.js +8 -0
  269. package/dist/geolocation/providers/ipgeolocation-provider.d.ts +18 -0
  270. package/dist/geolocation/providers/ipgeolocation-provider.js +8 -0
  271. package/dist/geolocation/providers/maxmind-provider.d.ts +18 -0
  272. package/dist/geolocation/providers/maxmind-provider.js +8 -0
  273. package/dist/hooks/useDataTable.d.ts +51 -0
  274. package/dist/hooks/useDataTable.js +149 -0
  275. package/dist/hooks/useDebounce.d.ts +7 -0
  276. package/dist/hooks/useDebounce.js +7 -0
  277. package/dist/hooks/useExitIntent.d.ts +35 -0
  278. package/dist/hooks/useExitIntent.js +72 -0
  279. package/dist/hooks/useTimezone.d.ts +19 -0
  280. package/dist/hooks/useTimezone.js +11 -0
  281. package/dist/logger/logger.d.ts +11 -0
  282. package/dist/logger/logger.js +17 -0
  283. package/dist/middleware/auth.d.ts +87 -0
  284. package/dist/middleware/auth.js +20 -0
  285. package/dist/middleware/cors.d.ts +30 -0
  286. package/dist/middleware/cors.js +10 -0
  287. package/dist/middleware/error-handler.d.ts +23 -0
  288. package/dist/middleware/error-handler.js +13 -0
  289. package/dist/middleware/index.d.ts +16 -0
  290. package/dist/middleware/index.js +72 -0
  291. package/dist/middleware/init-request.d.ts +18 -0
  292. package/dist/middleware/init-request.js +8 -0
  293. package/dist/middleware/middleware-chain.d.ts +53 -0
  294. package/dist/middleware/middleware-chain.js +8 -0
  295. package/dist/middleware/rate-limit.d.ts +82 -0
  296. package/dist/middleware/rate-limit.js +14 -0
  297. package/dist/middleware/response-logger.d.ts +22 -0
  298. package/dist/middleware/response-logger.js +8 -0
  299. package/dist/middleware/security.d.ts +31 -0
  300. package/dist/middleware/security.js +9 -0
  301. package/dist/middleware/types.d.ts +45 -0
  302. package/dist/middleware/types.js +0 -0
  303. package/dist/middleware/wrappers.d.ts +91 -0
  304. package/dist/middleware/wrappers.js +32 -0
  305. package/dist/storage/r2-storage.d.ts +38 -0
  306. package/dist/storage/r2-storage.js +105 -0
  307. package/dist/system/cpu.d.ts +2 -0
  308. package/dist/system/cpu.js +9 -0
  309. package/dist/system/disk.d.ts +2 -0
  310. package/dist/system/disk.js +9 -0
  311. package/dist/system/environment.d.ts +8 -0
  312. package/dist/system/environment.js +9 -0
  313. package/dist/system/health-check.d.ts +26 -0
  314. package/dist/system/health-check.js +10 -0
  315. package/dist/system/index.d.ts +51 -0
  316. package/dist/system/index.js +194 -0
  317. package/dist/system/memory.d.ts +2 -0
  318. package/dist/system/memory.js +9 -0
  319. package/dist/system/network.d.ts +2 -0
  320. package/dist/system/network.js +9 -0
  321. package/dist/system/types.d.ts +93 -0
  322. package/dist/system/types.js +0 -0
  323. package/dist/system/utils.d.ts +12 -0
  324. package/dist/system/utils.js +26 -0
  325. package/dist/types/api.d.ts +80 -0
  326. package/dist/types/api.js +0 -0
  327. package/dist/types/database.d.ts +38 -0
  328. package/dist/types/database.js +0 -0
  329. package/dist/types/env.d.ts +105 -0
  330. package/dist/types/env.js +0 -0
  331. package/dist/types/geoip.d.ts +152 -0
  332. package/dist/types/geoip.js +0 -0
  333. package/dist/types/i18n.d.ts +11 -0
  334. package/dist/types/i18n.js +0 -0
  335. package/dist/types/qr-code.d.ts +139 -0
  336. package/dist/types/qr-code.js +75 -0
  337. package/dist/types/user.d.ts +54 -0
  338. package/dist/types/user.js +0 -0
  339. package/dist/utils/api-helpers.d.ts +147 -0
  340. package/dist/utils/api-helpers.js +30 -0
  341. package/dist/utils/client/client-utils.d.ts +3 -0
  342. package/dist/utils/client/client-utils.js +9 -0
  343. package/dist/utils/client/qr-code.d.ts +16 -0
  344. package/dist/utils/client/qr-code.js +215 -0
  345. package/dist/utils/cors.d.ts +40 -0
  346. package/dist/utils/cors.js +21 -0
  347. package/dist/utils/csv-export.d.ts +97 -0
  348. package/dist/utils/csv-export.js +20 -0
  349. package/dist/utils/error-message-formatter.d.ts +17 -0
  350. package/dist/utils/error-message-formatter.js +11 -0
  351. package/dist/utils/error-processor.d.ts +70 -0
  352. package/dist/utils/error-processor.js +34 -0
  353. package/dist/utils/format-number.d.ts +17 -0
  354. package/dist/utils/format-number.js +9 -0
  355. package/dist/utils/index.d.ts +13 -0
  356. package/dist/utils/index.js +160 -0
  357. package/dist/utils/input-validation.d.ts +88 -0
  358. package/dist/utils/input-validation.js +223 -0
  359. package/dist/utils/ip-utils.d.ts +15 -0
  360. package/dist/utils/ip-utils.js +91 -0
  361. package/dist/utils/optimistic-lock.d.ts +27 -0
  362. package/dist/utils/optimistic-lock.js +16 -0
  363. package/dist/utils/sanitizer.d.ts +72 -0
  364. package/dist/utils/sanitizer.js +19 -0
  365. package/dist/utils/shared-utils.d.ts +25 -0
  366. package/dist/utils/shared-utils.js +43 -0
  367. package/dist/utils/short-code-generator.d.ts +24 -0
  368. package/dist/utils/short-code-generator.js +9 -0
  369. package/dist/utils/timezone.d.ts +56 -0
  370. package/dist/utils/timezone.js +29 -0
  371. package/dist/utils/type-guards.d.ts +164 -0
  372. package/dist/utils/type-guards.js +59 -0
  373. package/dist/utils/url-normalizer.d.ts +53 -0
  374. package/dist/utils/url-normalizer.js +21 -0
  375. package/dist/validators/index.d.ts +7 -0
  376. package/dist/validators/index.js +13 -0
  377. package/dist/validators/password-validator.d.ts +86 -0
  378. package/dist/validators/password-validator.js +13 -0
  379. package/dist/world_countries-C2WUL2CQ.js +279 -0
  380. package/package.json +129 -0
@@ -0,0 +1,606 @@
1
+ "use client";
2
+ import {
3
+ LoadingBar
4
+ } from "../../chunk-34WAGUT5.js";
5
+ import {
6
+ Input
7
+ } from "../../chunk-RJUVBBZG.js";
8
+ import {
9
+ Label
10
+ } from "../../chunk-IJEZ7G7S.js";
11
+ import {
12
+ Pagination,
13
+ PaginationContent,
14
+ PaginationEllipsis,
15
+ PaginationItem,
16
+ PaginationLink,
17
+ PaginationNext,
18
+ PaginationPrevious
19
+ } from "../../chunk-YJWLWUFK.js";
20
+ import {
21
+ Select,
22
+ SelectContent,
23
+ SelectItem,
24
+ SelectTrigger,
25
+ SelectValue
26
+ } from "../../chunk-WDUFQFDP.js";
27
+ import {
28
+ Alert,
29
+ AlertDescription
30
+ } from "../../chunk-F6LCSFSU.js";
31
+ import {
32
+ Button
33
+ } from "../../chunk-L25BNU3E.js";
34
+ import {
35
+ cn
36
+ } from "../../chunk-62FLBG6B.js";
37
+ import {
38
+ __spreadProps,
39
+ __spreadValues
40
+ } from "../../chunk-ORMEWXMH.js";
41
+
42
+ // src/components/ui/DataTable.tsx
43
+ import { useState, useRef, useEffect, isValidElement } from "react";
44
+ import { Filter, CheckSquare, Square, RefreshCw, Loader2 } from "lucide-react";
45
+ import { jsx, jsxs } from "react/jsx-runtime";
46
+ var DEFAULT_LABELS = {
47
+ search: "Search",
48
+ filter: "Filter",
49
+ filterActive: "Active",
50
+ clearFilters: "Clear Filters",
51
+ selectAll: "Select All",
52
+ selectAllShort: "All",
53
+ selected: "{count} / {total} selected",
54
+ processing: "Processing...",
55
+ processingItems: "Processing {count} items...",
56
+ loading: "Loading data...",
57
+ perPage: "{size} per page",
58
+ all: "All",
59
+ min: "Min",
60
+ max: "Max",
61
+ previous: "Previous",
62
+ next: "Next",
63
+ showing: "Showing {start} to {end} of {total} results"
64
+ };
65
+ function formatLabel(template, values) {
66
+ return Object.entries(values).reduce(
67
+ (result, [key, value]) => result.replace(new RegExp(`\\{${key}\\}`, "g"), String(value)),
68
+ template
69
+ );
70
+ }
71
+ function DataTable({
72
+ data,
73
+ columns,
74
+ loading = false,
75
+ error = null,
76
+ pagination,
77
+ sort,
78
+ bulkActions = [],
79
+ filters = [],
80
+ filterValues = {},
81
+ onFilterChange,
82
+ onClearFilters,
83
+ selectable = false,
84
+ onSelectionChange,
85
+ selectedIds = [],
86
+ getRowId,
87
+ className,
88
+ emptyMessage = "No data",
89
+ searchPlaceholder = "Search...",
90
+ onSearch,
91
+ onSearchValueChange,
92
+ searchValue = "",
93
+ showFilters = false,
94
+ onToggleFilters,
95
+ createButton,
96
+ labels: customLabels
97
+ }) {
98
+ const labels = __spreadValues(__spreadValues({}, DEFAULT_LABELS), customLabels);
99
+ const [localSelectedIds, setLocalSelectedIds] = useState(selectedIds);
100
+ const [bulkActionLoading, setBulkActionLoading] = useState(null);
101
+ const selectAllRef = useRef(null);
102
+ useEffect(() => {
103
+ setLocalSelectedIds(selectedIds);
104
+ }, [selectedIds]);
105
+ useEffect(() => {
106
+ if (selectAllRef.current) {
107
+ selectAllRef.current.indeterminate = localSelectedIds.length > 0 && localSelectedIds.length < data.length;
108
+ }
109
+ }, [localSelectedIds, data.length]);
110
+ const hasActiveFilters = (() => {
111
+ if (searchValue && searchValue.trim()) return true;
112
+ for (const [key, value] of Object.entries(filterValues)) {
113
+ if (value === void 0 || value === null || value === "") continue;
114
+ if (value === "all") continue;
115
+ if (typeof value === "object" && value !== null) {
116
+ if (key === "dateRange" && (value.start || value.end)) return true;
117
+ if (key === "clickRange" && (value.min || value.max)) return true;
118
+ if (key === "lastClickedRange" && (value.start || value.end)) return true;
119
+ } else {
120
+ if (key === "activeFilter" && value !== "all") return true;
121
+ if (key === "publicFilter" && value !== "all") return true;
122
+ if (key === "expirationFilter" && value !== "all") return true;
123
+ }
124
+ }
125
+ return false;
126
+ })();
127
+ const handleSelectAll = (checked) => {
128
+ const newSelection = checked ? data.map((item) => getRowId(item)) : [];
129
+ setLocalSelectedIds(newSelection);
130
+ onSelectionChange == null ? void 0 : onSelectionChange(newSelection);
131
+ };
132
+ const handleSelect = (id, checked) => {
133
+ const newSelection = checked ? [...localSelectedIds, id] : localSelectedIds.filter((item) => item !== id);
134
+ setLocalSelectedIds(newSelection);
135
+ onSelectionChange == null ? void 0 : onSelectionChange(newSelection);
136
+ };
137
+ const handleSort = (columnKey) => {
138
+ if (!sort) return;
139
+ if (sort.sort === columnKey) {
140
+ sort.onSortChange(columnKey, sort.order === "asc" ? "desc" : "asc");
141
+ } else {
142
+ sort.onSortChange(columnKey, "asc");
143
+ }
144
+ };
145
+ const handleSearch = (e) => {
146
+ if (e.key === "Enter" && onSearch) {
147
+ onSearch(searchValue);
148
+ }
149
+ };
150
+ const handleSearchClick = () => {
151
+ if (onSearch) {
152
+ onSearch(searchValue);
153
+ }
154
+ };
155
+ const handleSearchInputChange = (value) => {
156
+ if (onSearchValueChange) {
157
+ onSearchValueChange(value);
158
+ }
159
+ };
160
+ const handleBulkAction = async (action) => {
161
+ if (localSelectedIds.length === 0 || bulkActionLoading) return;
162
+ setBulkActionLoading(action.key);
163
+ try {
164
+ await action.onClick(localSelectedIds);
165
+ } finally {
166
+ setBulkActionLoading(null);
167
+ }
168
+ };
169
+ const visibleColumns = columns.filter((col) => !col.hidden);
170
+ return /* @__PURE__ */ jsxs("div", { className: cn("space-y-4", className), children: [
171
+ (onSearch || createButton) && /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-3 p-3 bg-muted rounded-lg", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-row items-center gap-2", children: [
172
+ onSearch && /* @__PURE__ */ jsxs("div", { className: "relative flex-1 min-w-0", children: [
173
+ /* @__PURE__ */ jsx(
174
+ Input,
175
+ {
176
+ "data-testid": "search-input",
177
+ placeholder: searchPlaceholder,
178
+ value: searchValue,
179
+ onChange: (e) => handleSearchInputChange(e.target.value),
180
+ onKeyPress: handleSearch,
181
+ className: "min-w-0 pr-20 h-10"
182
+ }
183
+ ),
184
+ /* @__PURE__ */ jsx(
185
+ Button,
186
+ {
187
+ "data-testid": "search-btn",
188
+ size: "sm",
189
+ onClick: handleSearchClick,
190
+ className: "absolute right-1 top-1/2 transform -translate-y-1/2 h-8 px-3 text-sm",
191
+ children: labels.search
192
+ }
193
+ )
194
+ ] }),
195
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 flex-shrink-0", children: [
196
+ filters.length > 0 && onToggleFilters && /* @__PURE__ */ jsxs(
197
+ Button,
198
+ {
199
+ "data-testid": "filter-toggle-btn",
200
+ variant: "outline",
201
+ size: "sm",
202
+ onClick: () => onToggleFilters(!showFilters),
203
+ className: "flex items-center gap-1 h-10 px-3",
204
+ children: [
205
+ /* @__PURE__ */ jsx(Filter, { className: "h-4 w-4" }),
206
+ /* @__PURE__ */ jsx("span", { className: "hidden sm:inline", children: labels.filter }),
207
+ hasActiveFilters && /* @__PURE__ */ jsx("span", { className: "ml-1 bg-primary text-primary-foreground text-xs px-1.5 py-0.5 rounded-full", children: labels.filterActive })
208
+ ]
209
+ }
210
+ ),
211
+ pagination && /* @__PURE__ */ jsx(
212
+ "select",
213
+ {
214
+ "data-testid": "page-size-select",
215
+ value: pagination.pageSize,
216
+ onChange: (e) => pagination.onPageSizeChange(Number(e.target.value)),
217
+ className: "border rounded px-3 py-2 text-sm bg-background h-10 min-w-[100px]",
218
+ children: (pagination.pageSizeOptions || [10, 20, 50]).map((size) => /* @__PURE__ */ jsx("option", { value: size, children: formatLabel(labels.perPage, { size }) }, size))
219
+ }
220
+ ),
221
+ createButton && (isValidElement(createButton) ? createButton : /* @__PURE__ */ jsx(
222
+ Button,
223
+ {
224
+ "data-testid": "create-btn",
225
+ onClick: createButton.onClick,
226
+ variant: "default",
227
+ size: "sm",
228
+ className: "flex-shrink-0 h-10 px-3",
229
+ children: createButton.label
230
+ }
231
+ ))
232
+ ] })
233
+ ] }) }),
234
+ showFilters && filters.length > 0 && /* @__PURE__ */ jsxs("div", { className: "p-2 bg-muted/50 rounded-lg space-y-2", children: [
235
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4", children: filters.map((filter) => {
236
+ var _a, _b, _c, _d, _e;
237
+ return /* @__PURE__ */ jsxs("div", { className: cn("space-y-1", filter.className), children: [
238
+ /* @__PURE__ */ jsx(Label, { className: "text-sm font-medium", children: filter.label }),
239
+ filter.type === "text" && /* @__PURE__ */ jsx(
240
+ Input,
241
+ {
242
+ "data-testid": `filter-${filter.key}`,
243
+ type: "text",
244
+ value: filterValues[filter.key] || "",
245
+ onChange: (e) => onFilterChange == null ? void 0 : onFilterChange(filter.key, e.target.value),
246
+ placeholder: filter.placeholder,
247
+ className: "text-xs"
248
+ }
249
+ ),
250
+ filter.type === "select" && /* @__PURE__ */ jsxs(
251
+ Select,
252
+ {
253
+ value: filterValues[filter.key] || "all",
254
+ onValueChange: (value) => onFilterChange == null ? void 0 : onFilterChange(filter.key, value),
255
+ children: [
256
+ /* @__PURE__ */ jsx(SelectTrigger, { "data-testid": `filter-${filter.key}`, className: "text-xs w-full h-9", children: /* @__PURE__ */ jsx(SelectValue, { placeholder: filter.placeholder }) }),
257
+ /* @__PURE__ */ jsxs(SelectContent, { children: [
258
+ /* @__PURE__ */ jsx(SelectItem, { value: "all", children: labels.all }),
259
+ (_a = filter.options) == null ? void 0 : _a.map((option) => /* @__PURE__ */ jsx(SelectItem, { value: option.value, children: option.label }, option.value))
260
+ ] })
261
+ ]
262
+ }
263
+ ),
264
+ filter.type === "date" && /* @__PURE__ */ jsx(
265
+ Input,
266
+ {
267
+ type: "date",
268
+ value: filterValues[filter.key] || "",
269
+ onChange: (e) => onFilterChange == null ? void 0 : onFilterChange(filter.key, e.target.value),
270
+ className: "text-xs"
271
+ }
272
+ ),
273
+ filter.type === "number" && /* @__PURE__ */ jsx(
274
+ Input,
275
+ {
276
+ type: "number",
277
+ value: filterValues[filter.key] || "",
278
+ onChange: (e) => onFilterChange == null ? void 0 : onFilterChange(filter.key, e.target.value),
279
+ placeholder: filter.placeholder,
280
+ className: "text-xs"
281
+ }
282
+ ),
283
+ filter.type === "range" && /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
284
+ /* @__PURE__ */ jsx(
285
+ Input,
286
+ {
287
+ type: filter.inputType || "text",
288
+ value: ((_b = filterValues[filter.key]) == null ? void 0 : _b.min) || ((_c = filterValues[filter.key]) == null ? void 0 : _c.start) || "",
289
+ onChange: (e) => {
290
+ const currentValue = filterValues[filter.key] || {};
291
+ const newValue = filter.key.includes("date") || filter.key.includes("Date") ? __spreadProps(__spreadValues({}, currentValue), { start: e.target.value }) : __spreadProps(__spreadValues({}, currentValue), { min: e.target.value });
292
+ onFilterChange == null ? void 0 : onFilterChange(filter.key, newValue);
293
+ },
294
+ className: "text-xs",
295
+ placeholder: filter.minPlaceholder || labels.min
296
+ }
297
+ ),
298
+ /* @__PURE__ */ jsx(
299
+ Input,
300
+ {
301
+ type: filter.inputType || "text",
302
+ value: ((_d = filterValues[filter.key]) == null ? void 0 : _d.max) || ((_e = filterValues[filter.key]) == null ? void 0 : _e.end) || "",
303
+ onChange: (e) => {
304
+ const currentValue = filterValues[filter.key] || {};
305
+ const newValue = filter.key.includes("date") || filter.key.includes("Date") ? __spreadProps(__spreadValues({}, currentValue), { end: e.target.value }) : __spreadProps(__spreadValues({}, currentValue), { max: e.target.value });
306
+ onFilterChange == null ? void 0 : onFilterChange(filter.key, newValue);
307
+ },
308
+ className: "text-xs",
309
+ placeholder: filter.maxPlaceholder || labels.max
310
+ }
311
+ )
312
+ ] })
313
+ ] }, filter.key);
314
+ }) }),
315
+ hasActiveFilters && onClearFilters && /* @__PURE__ */ jsx("div", { className: "flex justify-end", children: /* @__PURE__ */ jsxs(
316
+ Button,
317
+ {
318
+ "data-testid": "clear-filters-btn",
319
+ variant: "outline",
320
+ size: "sm",
321
+ onClick: onClearFilters,
322
+ className: "flex items-center gap-2",
323
+ children: [
324
+ /* @__PURE__ */ jsx(RefreshCw, { className: "h-4 w-4" }),
325
+ labels.clearFilters
326
+ ]
327
+ }
328
+ ) })
329
+ ] }),
330
+ selectable && bulkActions.length > 0 && /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3 p-3 bg-muted rounded-lg", children: [
331
+ /* @__PURE__ */ jsx("div", { className: "flex flex-col sm:flex-row items-start sm:items-center gap-3", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
332
+ /* @__PURE__ */ jsxs(
333
+ Button,
334
+ {
335
+ "data-testid": "select-all-btn",
336
+ variant: "outline",
337
+ size: "sm",
338
+ onClick: () => {
339
+ const allSelected = localSelectedIds.length === data.length && data.length > 0;
340
+ handleSelectAll(!allSelected);
341
+ },
342
+ className: "flex items-center gap-1 h-9 px-3",
343
+ children: [
344
+ localSelectedIds.length === data.length && data.length > 0 ? /* @__PURE__ */ jsx(CheckSquare, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx(Square, { className: "h-4 w-4" }),
345
+ /* @__PURE__ */ jsx("span", { className: "hidden sm:inline", children: labels.selectAll }),
346
+ /* @__PURE__ */ jsx("span", { className: "sm:hidden", children: labels.selectAllShort })
347
+ ]
348
+ }
349
+ ),
350
+ /* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground", children: formatLabel(labels.selected, { count: localSelectedIds.length, total: data.length }) })
351
+ ] }) }),
352
+ localSelectedIds.length > 0 && /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-6 gap-2", children: bulkActions.map((action) => {
353
+ var _a;
354
+ const isLoading = bulkActionLoading === action.key;
355
+ const isDisabled = !!bulkActionLoading || ((_a = action.disabled) == null ? void 0 : _a.call(action, localSelectedIds)) || localSelectedIds.length === 0;
356
+ return /* @__PURE__ */ jsxs(
357
+ Button,
358
+ {
359
+ "data-testid": `bulk-action-${action.key}`,
360
+ variant: action.variant || "outline",
361
+ size: "sm",
362
+ onClick: () => handleBulkAction(action),
363
+ disabled: isDisabled,
364
+ className: "flex items-center gap-1 h-9 text-xs",
365
+ children: [
366
+ isLoading ? /* @__PURE__ */ jsx(Loader2, { className: "h-3 w-3 animate-spin" }) : action.icon,
367
+ /* @__PURE__ */ jsx("span", { className: "hidden sm:inline", children: isLoading ? labels.processing : action.label }),
368
+ /* @__PURE__ */ jsx("span", { className: "sm:hidden", children: isLoading ? "..." : action.label.split(" ")[0] })
369
+ ]
370
+ },
371
+ action.key
372
+ );
373
+ }) })
374
+ ] }),
375
+ bulkActionLoading && /* @__PURE__ */ jsxs("div", { className: "p-3 bg-muted/50 rounded-lg", children: [
376
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
377
+ /* @__PURE__ */ jsx(Loader2, { className: "h-4 w-4 animate-spin text-primary" }),
378
+ /* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground", children: formatLabel(labels.processingItems, { count: localSelectedIds.length }) })
379
+ ] }),
380
+ /* @__PURE__ */ jsx(LoadingBar, { size: "sm", variant: "primary", className: "mt-2" })
381
+ ] }),
382
+ error && /* @__PURE__ */ jsx(Alert, { variant: "destructive", children: /* @__PURE__ */ jsx(AlertDescription, { children: error }) }),
383
+ /* @__PURE__ */ jsx("div", { className: "border rounded-lg overflow-hidden", children: /* @__PURE__ */ jsx("div", { className: "overflow-x-auto max-w-full", children: /* @__PURE__ */ jsxs("table", { className: "w-full text-sm min-w-full", children: [
384
+ /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { className: "border-b bg-muted/50", children: [
385
+ selectable && /* @__PURE__ */ jsx("th", { className: "px-1 py-2 text-left font-medium w-8", children: /* @__PURE__ */ jsx(
386
+ "input",
387
+ {
388
+ "data-testid": "select-all-checkbox",
389
+ type: "checkbox",
390
+ ref: selectAllRef,
391
+ checked: data.length > 0 && localSelectedIds.length === data.length,
392
+ onChange: (e) => handleSelectAll(e.target.checked),
393
+ className: "h-4 w-4"
394
+ }
395
+ ) }),
396
+ visibleColumns.map((column) => {
397
+ var _a, _b, _c, _d;
398
+ const width = column.width === "auto" ? void 0 : column.width;
399
+ const minWidth = column.minWidth;
400
+ return /* @__PURE__ */ jsx(
401
+ "th",
402
+ {
403
+ className: cn(
404
+ "px-2 py-2 font-medium",
405
+ column.sortable && "cursor-pointer",
406
+ column.className,
407
+ ((_a = column.responsive) == null ? void 0 : _a.sm) && "hidden sm:table-cell",
408
+ ((_b = column.responsive) == null ? void 0 : _b.md) && "hidden md:table-cell",
409
+ ((_c = column.responsive) == null ? void 0 : _c.lg) && "hidden lg:table-cell",
410
+ ((_d = column.responsive) == null ? void 0 : _d.xl) && "hidden xl:table-cell"
411
+ ),
412
+ style: {
413
+ width,
414
+ minWidth: minWidth || width || void 0,
415
+ maxWidth: column.maxWidth || void 0
416
+ },
417
+ onClick: column.sortable ? () => handleSort(column.key) : void 0,
418
+ children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-center gap-1", children: [
419
+ column.header,
420
+ column.sortable && sort && sort.sort === column.key && /* @__PURE__ */ jsx("span", { children: sort.order === "asc" ? "\u25B2" : "\u25BC" })
421
+ ] })
422
+ },
423
+ column.key
424
+ );
425
+ })
426
+ ] }) }),
427
+ /* @__PURE__ */ jsx("tbody", { children: loading ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx(
428
+ "td",
429
+ {
430
+ colSpan: visibleColumns.length + (selectable ? 1 : 0),
431
+ className: "text-center py-8",
432
+ children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center space-y-3", children: [
433
+ /* @__PURE__ */ jsx(LoadingBar, { size: "md", variant: "primary", className: "w-64" }),
434
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: labels.loading })
435
+ ] })
436
+ }
437
+ ) }) : error ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx(
438
+ "td",
439
+ {
440
+ colSpan: visibleColumns.length + (selectable ? 1 : 0),
441
+ className: "text-center py-8 text-destructive",
442
+ children: error
443
+ }
444
+ ) }) : data.length === 0 ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx(
445
+ "td",
446
+ {
447
+ colSpan: visibleColumns.length + (selectable ? 1 : 0),
448
+ className: "text-center py-8 text-muted-foreground",
449
+ children: emptyMessage
450
+ }
451
+ ) }) : data.map((item) => {
452
+ const rowId = getRowId(item);
453
+ return /* @__PURE__ */ jsxs(
454
+ "tr",
455
+ {
456
+ className: cn(
457
+ "border-b last:border-0 hover:bg-muted/30",
458
+ localSelectedIds.includes(rowId) && "bg-primary/5"
459
+ ),
460
+ children: [
461
+ selectable && /* @__PURE__ */ jsx("td", { className: "px-1 py-2 w-8", children: /* @__PURE__ */ jsx(
462
+ "input",
463
+ {
464
+ "data-testid": `row-checkbox-${rowId}`,
465
+ type: "checkbox",
466
+ checked: localSelectedIds.includes(rowId),
467
+ onChange: (e) => handleSelect(rowId, e.target.checked),
468
+ className: "h-4 w-4"
469
+ }
470
+ ) }),
471
+ visibleColumns.map((column) => {
472
+ var _a, _b, _c, _d;
473
+ return /* @__PURE__ */ jsx(
474
+ "td",
475
+ {
476
+ className: cn(
477
+ "px-2 py-3 overflow-hidden",
478
+ column.className,
479
+ ((_a = column.responsive) == null ? void 0 : _a.sm) && "hidden sm:table-cell",
480
+ ((_b = column.responsive) == null ? void 0 : _b.md) && "hidden md:table-cell",
481
+ ((_c = column.responsive) == null ? void 0 : _c.lg) && "hidden lg:table-cell",
482
+ ((_d = column.responsive) == null ? void 0 : _d.xl) && "hidden xl:table-cell"
483
+ ),
484
+ style: {
485
+ maxWidth: column.maxWidth || column.width || void 0
486
+ },
487
+ children: column.cell ? column.cell(item) : column.accessorKey ? String(item[column.accessorKey] || "") : ""
488
+ },
489
+ column.key
490
+ );
491
+ })
492
+ ]
493
+ },
494
+ rowId
495
+ );
496
+ }) })
497
+ ] }) }) }),
498
+ pagination && pagination.total > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-col sm:flex-row items-center justify-between gap-3 p-3 bg-muted/50 rounded-lg", children: /* @__PURE__ */ jsx(Pagination, { className: "w-full", children: /* @__PURE__ */ jsxs(PaginationContent, { className: "flex-wrap gap-1 justify-between w-full items-center", children: [
499
+ /* @__PURE__ */ jsx("div", { className: "text-sm text-muted-foreground text-center sm:text-left whitespace-nowrap", children: formatLabel(labels.showing, {
500
+ start: (pagination.page - 1) * pagination.pageSize + 1,
501
+ end: Math.min(pagination.page * pagination.pageSize, pagination.total),
502
+ total: pagination.total
503
+ }) }),
504
+ /* @__PURE__ */ jsx(PaginationItem, { children: /* @__PURE__ */ jsxs(
505
+ PaginationPrevious,
506
+ {
507
+ href: "#",
508
+ onClick: (e) => {
509
+ e.preventDefault();
510
+ if (pagination.page > 1) pagination.onPageChange(pagination.page - 1);
511
+ },
512
+ className: pagination.page <= 1 ? "pointer-events-none opacity-50" : "",
513
+ children: [
514
+ /* @__PURE__ */ jsx("span", { className: "hidden sm:inline", children: labels.previous }),
515
+ /* @__PURE__ */ jsx("span", { className: "sm:hidden", children: "\u2190" })
516
+ ]
517
+ }
518
+ ) }),
519
+ /* @__PURE__ */ jsx("div", { className: "hidden sm:flex", children: (() => {
520
+ const totalPages = Math.ceil(pagination.total / pagination.pageSize);
521
+ const pages = [];
522
+ if (pagination.page > 3) {
523
+ pages.push(
524
+ /* @__PURE__ */ jsx(PaginationItem, { children: /* @__PURE__ */ jsx(
525
+ PaginationLink,
526
+ {
527
+ href: "#",
528
+ onClick: (e) => {
529
+ e.preventDefault();
530
+ pagination.onPageChange(1);
531
+ },
532
+ children: "1"
533
+ }
534
+ ) }, 1)
535
+ );
536
+ if (pagination.page > 4) {
537
+ pages.push(
538
+ /* @__PURE__ */ jsx(PaginationItem, { children: /* @__PURE__ */ jsx(PaginationEllipsis, {}) }, "ellipsis1")
539
+ );
540
+ }
541
+ }
542
+ for (let i = Math.max(1, pagination.page - 2); i <= Math.min(totalPages, pagination.page + 2); i++) {
543
+ pages.push(
544
+ /* @__PURE__ */ jsx(PaginationItem, { children: /* @__PURE__ */ jsx(
545
+ PaginationLink,
546
+ {
547
+ href: "#",
548
+ isActive: i === pagination.page,
549
+ onClick: (e) => {
550
+ e.preventDefault();
551
+ pagination.onPageChange(i);
552
+ },
553
+ children: i
554
+ }
555
+ ) }, i)
556
+ );
557
+ }
558
+ if (pagination.page < totalPages - 2) {
559
+ if (pagination.page < totalPages - 3) {
560
+ pages.push(
561
+ /* @__PURE__ */ jsx(PaginationItem, { children: /* @__PURE__ */ jsx(PaginationEllipsis, {}) }, "ellipsis2")
562
+ );
563
+ }
564
+ pages.push(
565
+ /* @__PURE__ */ jsx(PaginationItem, { children: /* @__PURE__ */ jsx(
566
+ PaginationLink,
567
+ {
568
+ href: "#",
569
+ onClick: (e) => {
570
+ e.preventDefault();
571
+ pagination.onPageChange(totalPages);
572
+ },
573
+ children: totalPages
574
+ }
575
+ ) }, totalPages)
576
+ );
577
+ }
578
+ return pages;
579
+ })() }),
580
+ /* @__PURE__ */ jsx("div", { className: "sm:hidden", children: /* @__PURE__ */ jsxs("span", { className: "px-3 py-2 text-sm font-medium", children: [
581
+ pagination.page,
582
+ " / ",
583
+ Math.ceil(pagination.total / pagination.pageSize)
584
+ ] }) }),
585
+ /* @__PURE__ */ jsx(PaginationItem, { children: /* @__PURE__ */ jsxs(
586
+ PaginationNext,
587
+ {
588
+ href: "#",
589
+ onClick: (e) => {
590
+ e.preventDefault();
591
+ const totalPages = Math.ceil(pagination.total / pagination.pageSize);
592
+ if (pagination.page < totalPages) pagination.onPageChange(pagination.page + 1);
593
+ },
594
+ className: pagination.page >= Math.ceil(pagination.total / pagination.pageSize) ? "pointer-events-none opacity-50" : "",
595
+ children: [
596
+ /* @__PURE__ */ jsx("span", { className: "hidden sm:inline", children: labels.next }),
597
+ /* @__PURE__ */ jsx("span", { className: "sm:hidden", children: "\u2192" })
598
+ ]
599
+ }
600
+ ) })
601
+ ] }) }) })
602
+ ] });
603
+ }
604
+ export {
605
+ DataTable
606
+ };
@@ -0,0 +1,12 @@
1
+ interface IDomainDisplayProps {
2
+ className?: string;
3
+ showProtocol?: boolean;
4
+ baseUrl?: string;
5
+ appendTrailingSlash?: boolean;
6
+ }
7
+ /**
8
+ * 도메인을 표시하는 컴포넌트
9
+ * baseUrl prop이 없으면 현재 브라우저 도메인을 기준으로 표시합니다.
10
+ */
11
+ export declare function DomainDisplay({ className, showProtocol, baseUrl, appendTrailingSlash }: IDomainDisplayProps): import("react/jsx-runtime").JSX.Element;
12
+ export {};
@@ -0,0 +1,31 @@
1
+ "use client";
2
+ import "../../chunk-ORMEWXMH.js";
3
+
4
+ // src/components/ui/DomainDisplay.tsx
5
+ import { useEffect, useMemo, useState } from "react";
6
+ import { jsx } from "react/jsx-runtime";
7
+ var FALLBACK_BASE_URL = "https://example.com";
8
+ function DomainDisplay({
9
+ className = "",
10
+ showProtocol = true,
11
+ baseUrl,
12
+ appendTrailingSlash = true
13
+ }) {
14
+ const initialBaseUrl = useMemo(() => {
15
+ if (baseUrl) return baseUrl;
16
+ if (typeof window !== "undefined") return window.location.origin;
17
+ return FALLBACK_BASE_URL;
18
+ }, [baseUrl]);
19
+ const [resolvedBaseUrl, setResolvedBaseUrl] = useState(initialBaseUrl);
20
+ useEffect(() => {
21
+ if (!baseUrl && typeof window !== "undefined") {
22
+ setResolvedBaseUrl(window.location.origin);
23
+ }
24
+ }, [baseUrl]);
25
+ const normalizedBase = showProtocol ? resolvedBaseUrl : resolvedBaseUrl.replace(/^https?:\/\//, "");
26
+ const displayDomain = appendTrailingSlash ? normalizedBase.endsWith("/") ? normalizedBase : `${normalizedBase}/` : normalizedBase.replace(/\/$/, "");
27
+ return /* @__PURE__ */ jsx("span", { className: `font-mono text-sm text-muted-foreground ${className}`, children: displayDomain });
28
+ }
29
+ export {
30
+ DomainDisplay
31
+ };
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ export interface IInputProps extends React.InputHTMLAttributes<HTMLInputElement> {
3
+ className?: string;
4
+ }
5
+ export declare function Input({ className, type, ...props }: IInputProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,8 @@
1
+ import {
2
+ Input
3
+ } from "../../chunk-RJUVBBZG.js";
4
+ import "../../chunk-62FLBG6B.js";
5
+ import "../../chunk-ORMEWXMH.js";
6
+ export {
7
+ Input
8
+ };
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ export interface ILabelProps extends React.LabelHTMLAttributes<HTMLLabelElement> {
3
+ className?: string;
4
+ }
5
+ export declare function Label({ className, ...props }: ILabelProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,8 @@
1
+ import {
2
+ Label
3
+ } from "../../chunk-IJEZ7G7S.js";
4
+ import "../../chunk-62FLBG6B.js";
5
+ import "../../chunk-ORMEWXMH.js";
6
+ export {
7
+ Label
8
+ };