ikoncomponents 1.4.8 → 1.5.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 (576) hide show
  1. package/bin.js +2 -0
  2. package/dist/commands/init.js +57 -0
  3. package/dist/index.js +3 -116
  4. package/dist/utlis/copyDir.js +7 -0
  5. package/package.json +18 -92
  6. package/templates/default/hooks/use-mobile.ts +19 -0
  7. package/templates/default/ikonShade/accordion.tsx +66 -0
  8. package/templates/default/ikonShade/alert-dialog.tsx +179 -0
  9. package/templates/default/ikonShade/alert.tsx +66 -0
  10. package/templates/default/ikonShade/aspect-ratio.tsx +11 -0
  11. package/templates/default/ikonShade/avatar.tsx +53 -0
  12. package/templates/default/ikonShade/badge.tsx +49 -0
  13. package/templates/default/ikonShade/breadcrumb.tsx +109 -0
  14. package/templates/default/ikonShade/button.tsx +64 -0
  15. package/templates/default/ikonShade/calendar.tsx +227 -0
  16. package/templates/default/ikonShade/card.tsx +92 -0
  17. package/templates/default/ikonShade/checkbox.tsx +33 -0
  18. package/templates/default/ikonShade/collapsible.tsx +33 -0
  19. package/templates/default/ikonShade/command.tsx +184 -0
  20. package/templates/default/ikonShade/date-input.tsx +259 -0
  21. package/templates/default/ikonShade/date-range-picker.tsx +103 -0
  22. package/templates/default/ikonShade/dialog.tsx +143 -0
  23. package/templates/default/ikonShade/drawer.tsx +134 -0
  24. package/templates/default/ikonShade/dropdown-menu.tsx +259 -0
  25. package/templates/default/ikonShade/form.tsx +166 -0
  26. package/templates/default/ikonShade/hover-card.tsx +44 -0
  27. package/templates/default/ikonShade/input-otp.tsx +71 -0
  28. package/templates/default/ikonShade/input.tsx +22 -0
  29. package/templates/default/ikonShade/label.tsx +24 -0
  30. package/templates/default/ikonShade/navigation-menu.tsx +195 -0
  31. package/templates/default/ikonShade/popover.tsx +48 -0
  32. package/templates/default/ikonShade/progress.tsx +40 -0
  33. package/templates/default/ikonShade/radio-group.tsx +45 -0
  34. package/templates/default/ikonShade/scroll-area.tsx +58 -0
  35. package/templates/default/ikonShade/select.tsx +184 -0
  36. package/templates/default/ikonShade/separator.tsx +28 -0
  37. package/templates/default/ikonShade/sheet.tsx +139 -0
  38. package/templates/default/ikonShade/sidebar.tsx +726 -0
  39. package/templates/default/ikonShade/skeleton.tsx +15 -0
  40. package/templates/default/ikonShade/slider.tsx +64 -0
  41. package/templates/default/ikonShade/sonner.tsx +25 -0
  42. package/templates/default/ikonShade/switch.tsx +31 -0
  43. package/templates/default/ikonShade/table.tsx +116 -0
  44. package/templates/default/ikonShade/tabs.tsx +67 -0
  45. package/templates/default/ikonShade/textarea.tsx +18 -0
  46. package/templates/default/ikonShade/toggle-group.tsx +83 -0
  47. package/templates/default/ikonShade/toggle.tsx +47 -0
  48. package/templates/default/ikonShade/tooltip.tsx +65 -0
  49. package/templates/default/ikonShade/workflow.tsx +119 -0
  50. package/templates/default/ikoncomponents/action-menu/index.tsx +108 -0
  51. package/templates/default/ikoncomponents/action-menu/type.ts +18 -0
  52. package/templates/default/ikoncomponents/activity-sheet/index.tsx +63 -0
  53. package/templates/default/ikoncomponents/alert-dialog/dialog-context.tsx +65 -0
  54. package/templates/default/ikoncomponents/alert-dialog/index.tsx +80 -0
  55. package/templates/default/ikoncomponents/app-breadcrumb/BreadcrumbProvider.tsx +68 -0
  56. package/templates/default/ikoncomponents/app-breadcrumb/index.tsx +222 -0
  57. package/templates/default/ikoncomponents/big-calendar/big-calender-event/index.tsx +38 -0
  58. package/templates/default/ikoncomponents/big-calendar/big-calender-toolbar/index.tsx +81 -0
  59. package/templates/default/ikoncomponents/big-calendar/index.css +879 -0
  60. package/templates/default/ikoncomponents/big-calendar/index.tsx +59 -0
  61. package/templates/default/ikoncomponents/big-calendar/type.ts +37 -0
  62. package/templates/default/ikoncomponents/buttons/index.tsx +127 -0
  63. package/templates/default/ikoncomponents/combobox-input/index.tsx +75 -0
  64. package/templates/default/ikoncomponents/combobox-input/type.ts +14 -0
  65. package/templates/default/ikoncomponents/custom-combo-dropdown/index.tsx +242 -0
  66. package/templates/default/ikoncomponents/data-table/datatable-column-filter/index.tsx +80 -0
  67. package/templates/default/ikoncomponents/data-table/datatable-faceted-filter/index.tsx +149 -0
  68. package/templates/default/ikoncomponents/data-table/datatable-filter-menu/index.tsx +98 -0
  69. package/templates/default/ikoncomponents/data-table/datatable-pagination/index.tsx +119 -0
  70. package/templates/default/ikoncomponents/data-table/datatable-toolbar/index.tsx +45 -0
  71. package/templates/default/ikoncomponents/data-table/function.ts +7 -0
  72. package/templates/default/ikoncomponents/data-table/index.tsx +549 -0
  73. package/templates/default/ikoncomponents/data-table/type.ts +75 -0
  74. package/templates/default/ikoncomponents/e-chart/index.tsx +183 -0
  75. package/templates/default/ikoncomponents/file-input/index.tsx +27 -0
  76. package/templates/default/ikoncomponents/fileUpload/index.tsx +121 -0
  77. package/templates/default/ikoncomponents/form-fields/combobox-input/index.tsx +111 -0
  78. package/templates/default/ikoncomponents/form-fields/combobox-input-value/index.tsx +121 -0
  79. package/templates/default/ikoncomponents/form-fields/date-input/index.tsx +80 -0
  80. package/templates/default/ikoncomponents/form-fields/file-input/index.tsx +9 -0
  81. package/templates/default/ikoncomponents/form-fields/input/index.tsx +27 -0
  82. package/{dist/ikoncomponents/form-fields/multi-combobox-input/index.js → templates/default/ikoncomponents/form-fields/multi-combobox-input/index.tsx} +574 -381
  83. package/templates/default/ikoncomponents/form-fields/otp-input/index.tsx +39 -0
  84. package/templates/default/ikoncomponents/form-fields/password-input/index.tsx +52 -0
  85. package/templates/default/ikoncomponents/form-fields/phone-input/index.tsx +7 -0
  86. package/templates/default/ikoncomponents/form-fields/textarea/index.tsx +28 -0
  87. package/templates/default/ikoncomponents/form-fields/types/index.ts +46 -0
  88. package/templates/default/ikoncomponents/glowing-effect/index.tsx +171 -0
  89. package/templates/default/ikoncomponents/icon/index.tsx +22 -0
  90. package/templates/default/ikoncomponents/image-cropper-upload/components/cropperImg.css +19 -0
  91. package/{dist/ikoncomponents/image-cropper-upload/components/newCropper.js → templates/default/ikoncomponents/image-cropper-upload/components/newCropper.tsx} +117 -85
  92. package/templates/default/ikoncomponents/image-cropper-upload/components/newImageUploadForm.tsx +352 -0
  93. package/templates/default/ikoncomponents/image-cropper-upload/cropper-form/index.tsx +250 -0
  94. package/templates/default/ikoncomponents/image-cropper-upload/cropper-form-with-modal/index.tsx +32 -0
  95. package/{dist/ikoncomponents/image-cropper-upload/image-cropper/index.js → templates/default/ikoncomponents/image-cropper-upload/image-cropper/index.tsx} +119 -87
  96. package/templates/default/ikoncomponents/image-cropper-upload/index.tsx +95 -0
  97. package/templates/default/ikoncomponents/image-cropper-upload/utils/index.ts +117 -0
  98. package/templates/default/ikoncomponents/loading-spinner/index.tsx +43 -0
  99. package/templates/default/ikoncomponents/main-layout/RefreshContext.tsx +30 -0
  100. package/templates/default/ikoncomponents/main-layout/SidebarNavContext.tsx +103 -0
  101. package/templates/default/ikoncomponents/main-layout/app-sidebar.tsx +36 -0
  102. package/templates/default/ikoncomponents/main-layout/footer.tsx +21 -0
  103. package/templates/default/ikoncomponents/main-layout/header.tsx +53 -0
  104. package/templates/default/ikoncomponents/main-layout/index.tsx +43 -0
  105. package/templates/default/ikoncomponents/main-layout/main-sidebar.tsx +389 -0
  106. package/templates/default/ikoncomponents/main-layout/nav-main.tsx +103 -0
  107. package/templates/default/ikoncomponents/multi-combobox/index.tsx +345 -0
  108. package/templates/default/ikoncomponents/no-data/index.tsx +11 -0
  109. package/templates/default/ikoncomponents/page-wrapper/index.tsx +30 -0
  110. package/templates/default/ikoncomponents/password-strength-meter/index.tsx +49 -0
  111. package/templates/default/ikoncomponents/phone-input/index.tsx +72 -0
  112. package/templates/default/ikoncomponents/provider-wrapper/index.tsx +32 -0
  113. package/templates/default/ikoncomponents/search-input/index.tsx +18 -0
  114. package/templates/default/ikoncomponents/sheet/index.tsx +34 -0
  115. package/templates/default/ikoncomponents/simple-widget/index.tsx +54 -0
  116. package/templates/default/ikoncomponents/skeleton-loader/skeleton-table.tsx +34 -0
  117. package/templates/default/ikoncomponents/skeleton-loader/skeleton-widget.tsx +13 -0
  118. package/templates/default/ikoncomponents/tabs/index.tsx +139 -0
  119. package/{dist/ikoncomponents/tabs/type.d.ts → templates/default/ikoncomponents/tabs/type.ts} +20 -20
  120. package/{dist/ikoncomponents/theme-toggle-btn/index.js → templates/default/ikoncomponents/theme-toggle-btn/index.tsx} +189 -118
  121. package/templates/default/ikoncomponents/title-progress/index.tsx +41 -0
  122. package/templates/default/ikoncomponents/tooltip/index.tsx +17 -0
  123. package/templates/default/ikoncomponents/twolevel-dropdown/convertToDropdownNodes.tsx +33 -0
  124. package/templates/default/ikoncomponents/twolevel-dropdown/index.tsx +279 -0
  125. package/templates/default/ikoncomponents/upload-tab/index.tsx +237 -0
  126. package/templates/default/ikoncomponents/widgets/index.tsx +81 -0
  127. package/templates/default/ikoncomponents/widgets/type.ts +11 -0
  128. package/templates/default/ikoncomponents/work-in-progress/index.tsx +16 -0
  129. package/{dist/index.d.ts → templates/default/index.ts} +234 -139
  130. package/templates/default/styles.css +1159 -0
  131. package/templates/default/utils/actions/account/index.ts +33 -0
  132. package/templates/default/utils/actions/account/type.ts +4 -0
  133. package/{dist/utils/actions/auth/index.js → templates/default/utils/actions/auth/index.ts} +69 -58
  134. package/templates/default/utils/actions/common/revalidate.ts +18 -0
  135. package/templates/default/utils/actions/common/type.ts +4 -0
  136. package/{dist/utils/actions/common/utils.js → templates/default/utils/actions/common/utils.ts} +28 -25
  137. package/templates/default/utils/actions/software/index.ts +106 -0
  138. package/templates/default/utils/api/accountService/index.ts +103 -0
  139. package/templates/default/utils/api/accountService/type.ts +4 -0
  140. package/templates/default/utils/api/file-upload/index.ts +103 -0
  141. package/templates/default/utils/api/file-upload/type.ts +8 -0
  142. package/{dist/utils/api/ikonBaseApi.js → templates/default/utils/api/ikonBaseApi.ts} +132 -104
  143. package/templates/default/utils/api/loginService/index.ts +108 -0
  144. package/{dist/utils/api/loginService/type.d.ts → templates/default/utils/api/loginService/type.ts} +35 -32
  145. package/templates/default/utils/api/softwareService/index.ts +356 -0
  146. package/templates/default/utils/api/softwareService/type.ts +62 -0
  147. package/{dist/utils/border-radius-provider.js → templates/default/utils/border-radius-provider.tsx} +59 -35
  148. package/templates/default/utils/cn.ts +6 -0
  149. package/{dist/utils/font-provider.js → templates/default/utils/font-provider.tsx} +61 -37
  150. package/templates/default/utils/session/cookieSession.ts +49 -0
  151. package/templates/default/utils/theme-provider/index.tsx +11 -0
  152. package/templates/default/utils/token-management/index.ts +115 -0
  153. package/templates/default/utils/token-management/types.ts +6 -0
  154. package/dist/hooks/use-mobile.d.ts +0 -2
  155. package/dist/hooks/use-mobile.d.ts.map +0 -1
  156. package/dist/hooks/use-mobile.js +0 -15
  157. package/dist/ikoncomponents/action-menu/index.d.ts +0 -6
  158. package/dist/ikoncomponents/action-menu/index.d.ts.map +0 -1
  159. package/dist/ikoncomponents/action-menu/index.js +0 -42
  160. package/dist/ikoncomponents/action-menu/type.d.ts +0 -15
  161. package/dist/ikoncomponents/action-menu/type.d.ts.map +0 -1
  162. package/dist/ikoncomponents/action-menu/type.js +0 -1
  163. package/dist/ikoncomponents/activity-sheet/index.d.ts +0 -12
  164. package/dist/ikoncomponents/activity-sheet/index.d.ts.map +0 -1
  165. package/dist/ikoncomponents/activity-sheet/index.js +0 -23
  166. package/dist/ikoncomponents/alert-dialog/dialog-context.d.ts +0 -22
  167. package/dist/ikoncomponents/alert-dialog/dialog-context.d.ts.map +0 -1
  168. package/dist/ikoncomponents/alert-dialog/dialog-context.js +0 -30
  169. package/dist/ikoncomponents/alert-dialog/index.d.ts +0 -15
  170. package/dist/ikoncomponents/alert-dialog/index.d.ts.map +0 -1
  171. package/dist/ikoncomponents/alert-dialog/index.js +0 -20
  172. package/dist/ikoncomponents/app-breadcrumb/BreadcrumbProvider.d.ts +0 -19
  173. package/dist/ikoncomponents/app-breadcrumb/BreadcrumbProvider.d.ts.map +0 -1
  174. package/dist/ikoncomponents/app-breadcrumb/BreadcrumbProvider.js +0 -43
  175. package/dist/ikoncomponents/app-breadcrumb/index.d.ts +0 -6
  176. package/dist/ikoncomponents/app-breadcrumb/index.d.ts.map +0 -1
  177. package/dist/ikoncomponents/app-breadcrumb/index.js +0 -57
  178. package/dist/ikoncomponents/big-calendar/big-calender-event/index.d.ts +0 -6
  179. package/dist/ikoncomponents/big-calendar/big-calender-event/index.d.ts.map +0 -1
  180. package/dist/ikoncomponents/big-calendar/big-calender-event/index.js +0 -16
  181. package/dist/ikoncomponents/big-calendar/big-calender-toolbar/index.d.ts +0 -3
  182. package/dist/ikoncomponents/big-calendar/big-calender-toolbar/index.d.ts.map +0 -1
  183. package/dist/ikoncomponents/big-calendar/big-calender-toolbar/index.js +0 -39
  184. package/dist/ikoncomponents/big-calendar/index.d.ts +0 -4
  185. package/dist/ikoncomponents/big-calendar/index.d.ts.map +0 -1
  186. package/dist/ikoncomponents/big-calendar/index.js +0 -35
  187. package/dist/ikoncomponents/big-calendar/type.d.ts +0 -32
  188. package/dist/ikoncomponents/big-calendar/type.d.ts.map +0 -1
  189. package/dist/ikoncomponents/big-calendar/type.js +0 -1
  190. package/dist/ikoncomponents/buttons/index.d.ts +0 -19
  191. package/dist/ikoncomponents/buttons/index.d.ts.map +0 -1
  192. package/dist/ikoncomponents/buttons/index.js +0 -38
  193. package/dist/ikoncomponents/combobox-input/index.d.ts +0 -3
  194. package/dist/ikoncomponents/combobox-input/index.d.ts.map +0 -1
  195. package/dist/ikoncomponents/combobox-input/index.js +0 -18
  196. package/dist/ikoncomponents/combobox-input/type.d.ts +0 -14
  197. package/dist/ikoncomponents/combobox-input/type.d.ts.map +0 -1
  198. package/dist/ikoncomponents/combobox-input/type.js +0 -1
  199. package/dist/ikoncomponents/custom-combo-dropdown/index.d.ts +0 -22
  200. package/dist/ikoncomponents/custom-combo-dropdown/index.d.ts.map +0 -1
  201. package/dist/ikoncomponents/custom-combo-dropdown/index.js +0 -85
  202. package/dist/ikoncomponents/data-table/datatable-column-filter/index.d.ts +0 -3
  203. package/dist/ikoncomponents/data-table/datatable-column-filter/index.d.ts.map +0 -1
  204. package/dist/ikoncomponents/data-table/datatable-column-filter/index.js +0 -22
  205. package/dist/ikoncomponents/data-table/datatable-faceted-filter/index.d.ts +0 -3
  206. package/dist/ikoncomponents/data-table/datatable-faceted-filter/index.d.ts.map +0 -1
  207. package/dist/ikoncomponents/data-table/datatable-faceted-filter/index.js +0 -35
  208. package/dist/ikoncomponents/data-table/datatable-filter-menu/index.d.ts +0 -3
  209. package/dist/ikoncomponents/data-table/datatable-filter-menu/index.d.ts.map +0 -1
  210. package/dist/ikoncomponents/data-table/datatable-filter-menu/index.js +0 -38
  211. package/dist/ikoncomponents/data-table/datatable-pagination/index.d.ts +0 -3
  212. package/dist/ikoncomponents/data-table/datatable-pagination/index.d.ts.map +0 -1
  213. package/dist/ikoncomponents/data-table/datatable-pagination/index.js +0 -13
  214. package/dist/ikoncomponents/data-table/datatable-toolbar/index.d.ts +0 -3
  215. package/dist/ikoncomponents/data-table/datatable-toolbar/index.d.ts.map +0 -1
  216. package/dist/ikoncomponents/data-table/datatable-toolbar/index.js +0 -18
  217. package/dist/ikoncomponents/data-table/function.d.ts +0 -2
  218. package/dist/ikoncomponents/data-table/function.d.ts.map +0 -1
  219. package/dist/ikoncomponents/data-table/function.js +0 -6
  220. package/dist/ikoncomponents/data-table/index.d.ts +0 -3
  221. package/dist/ikoncomponents/data-table/index.d.ts.map +0 -1
  222. package/dist/ikoncomponents/data-table/index.js +0 -223
  223. package/dist/ikoncomponents/data-table/type.d.ts +0 -61
  224. package/dist/ikoncomponents/data-table/type.d.ts.map +0 -1
  225. package/dist/ikoncomponents/data-table/type.js +0 -1
  226. package/dist/ikoncomponents/e-chart/index.d.ts +0 -16
  227. package/dist/ikoncomponents/e-chart/index.d.ts.map +0 -1
  228. package/dist/ikoncomponents/e-chart/index.js +0 -115
  229. package/dist/ikoncomponents/file-input/index.d.ts +0 -2
  230. package/dist/ikoncomponents/file-input/index.d.ts.map +0 -1
  231. package/dist/ikoncomponents/file-input/index.js +0 -21
  232. package/dist/ikoncomponents/fileUpload/index.d.ts +0 -16
  233. package/dist/ikoncomponents/fileUpload/index.d.ts.map +0 -1
  234. package/dist/ikoncomponents/fileUpload/index.js +0 -69
  235. package/dist/ikoncomponents/form-fields/combobox-input/index.d.ts +0 -3
  236. package/dist/ikoncomponents/form-fields/combobox-input/index.d.ts.map +0 -1
  237. package/dist/ikoncomponents/form-fields/combobox-input/index.js +0 -21
  238. package/dist/ikoncomponents/form-fields/combobox-input-value/index.d.ts +0 -19
  239. package/dist/ikoncomponents/form-fields/combobox-input-value/index.d.ts.map +0 -1
  240. package/dist/ikoncomponents/form-fields/combobox-input-value/index.js +0 -26
  241. package/dist/ikoncomponents/form-fields/date-input/index.d.ts +0 -3
  242. package/dist/ikoncomponents/form-fields/date-input/index.d.ts.map +0 -1
  243. package/dist/ikoncomponents/form-fields/date-input/index.js +0 -15
  244. package/dist/ikoncomponents/form-fields/file-input/index.d.ts +0 -2
  245. package/dist/ikoncomponents/form-fields/file-input/index.d.ts.map +0 -1
  246. package/dist/ikoncomponents/form-fields/file-input/index.js +0 -4
  247. package/dist/ikoncomponents/form-fields/input/index.d.ts +0 -3
  248. package/dist/ikoncomponents/form-fields/input/index.d.ts.map +0 -1
  249. package/dist/ikoncomponents/form-fields/input/index.js +0 -18
  250. package/dist/ikoncomponents/form-fields/multi-combobox-input/index.d.ts +0 -7
  251. package/dist/ikoncomponents/form-fields/multi-combobox-input/index.d.ts.map +0 -1
  252. package/dist/ikoncomponents/form-fields/otp-input/index.d.ts +0 -3
  253. package/dist/ikoncomponents/form-fields/otp-input/index.d.ts.map +0 -1
  254. package/dist/ikoncomponents/form-fields/otp-input/index.js +0 -18
  255. package/dist/ikoncomponents/form-fields/password-input/index.d.ts +0 -3
  256. package/dist/ikoncomponents/form-fields/password-input/index.d.ts.map +0 -1
  257. package/dist/ikoncomponents/form-fields/password-input/index.js +0 -23
  258. package/dist/ikoncomponents/form-fields/phone-input/index.d.ts +0 -2
  259. package/dist/ikoncomponents/form-fields/phone-input/index.d.ts.map +0 -1
  260. package/dist/ikoncomponents/form-fields/phone-input/index.js +0 -4
  261. package/dist/ikoncomponents/form-fields/textarea/index.d.ts +0 -3
  262. package/dist/ikoncomponents/form-fields/textarea/index.d.ts.map +0 -1
  263. package/dist/ikoncomponents/form-fields/textarea/index.js +0 -18
  264. package/dist/ikoncomponents/form-fields/types/index.d.ts +0 -37
  265. package/dist/ikoncomponents/form-fields/types/index.d.ts.map +0 -1
  266. package/dist/ikoncomponents/form-fields/types/index.js +0 -1
  267. package/dist/ikoncomponents/glowing-effect/index.d.ts +0 -15
  268. package/dist/ikoncomponents/glowing-effect/index.d.ts.map +0 -1
  269. package/dist/ikoncomponents/glowing-effect/index.js +0 -84
  270. package/dist/ikoncomponents/icon/index.d.ts +0 -9
  271. package/dist/ikoncomponents/icon/index.d.ts.map +0 -1
  272. package/dist/ikoncomponents/icon/index.js +0 -23
  273. package/dist/ikoncomponents/image-cropper-upload/components/newCropper.d.ts +0 -16
  274. package/dist/ikoncomponents/image-cropper-upload/components/newCropper.d.ts.map +0 -1
  275. package/dist/ikoncomponents/image-cropper-upload/components/newImageUploadForm.d.ts +0 -8
  276. package/dist/ikoncomponents/image-cropper-upload/components/newImageUploadForm.d.ts.map +0 -1
  277. package/dist/ikoncomponents/image-cropper-upload/components/newImageUploadForm.js +0 -145
  278. package/dist/ikoncomponents/image-cropper-upload/cropper-form/index.d.ts +0 -7
  279. package/dist/ikoncomponents/image-cropper-upload/cropper-form/index.d.ts.map +0 -1
  280. package/dist/ikoncomponents/image-cropper-upload/cropper-form/index.js +0 -92
  281. package/dist/ikoncomponents/image-cropper-upload/cropper-form-with-modal/index.d.ts +0 -7
  282. package/dist/ikoncomponents/image-cropper-upload/cropper-form-with-modal/index.d.ts.map +0 -1
  283. package/dist/ikoncomponents/image-cropper-upload/cropper-form-with-modal/index.js +0 -14
  284. package/dist/ikoncomponents/image-cropper-upload/image-cropper/index.d.ts +0 -15
  285. package/dist/ikoncomponents/image-cropper-upload/image-cropper/index.d.ts.map +0 -1
  286. package/dist/ikoncomponents/image-cropper-upload/index.d.ts +0 -28
  287. package/dist/ikoncomponents/image-cropper-upload/index.d.ts.map +0 -1
  288. package/dist/ikoncomponents/image-cropper-upload/index.js +0 -49
  289. package/dist/ikoncomponents/image-cropper-upload/utils/index.d.ts +0 -17
  290. package/dist/ikoncomponents/image-cropper-upload/utils/index.d.ts.map +0 -1
  291. package/dist/ikoncomponents/image-cropper-upload/utils/index.js +0 -73
  292. package/dist/ikoncomponents/loading-spinner/index.d.ts +0 -10
  293. package/dist/ikoncomponents/loading-spinner/index.d.ts.map +0 -1
  294. package/dist/ikoncomponents/loading-spinner/index.js +0 -19
  295. package/dist/ikoncomponents/main-layout/RefreshContext.d.ts +0 -11
  296. package/dist/ikoncomponents/main-layout/RefreshContext.d.ts.map +0 -1
  297. package/dist/ikoncomponents/main-layout/RefreshContext.js +0 -17
  298. package/dist/ikoncomponents/main-layout/SidebarNavContext.d.ts +0 -34
  299. package/dist/ikoncomponents/main-layout/SidebarNavContext.d.ts.map +0 -1
  300. package/dist/ikoncomponents/main-layout/SidebarNavContext.js +0 -52
  301. package/dist/ikoncomponents/main-layout/app-sidebar.d.ts +0 -4
  302. package/dist/ikoncomponents/main-layout/app-sidebar.d.ts.map +0 -1
  303. package/dist/ikoncomponents/main-layout/app-sidebar.js +0 -24
  304. package/dist/ikoncomponents/main-layout/footer.d.ts +0 -2
  305. package/dist/ikoncomponents/main-layout/footer.d.ts.map +0 -1
  306. package/dist/ikoncomponents/main-layout/footer.js +0 -5
  307. package/dist/ikoncomponents/main-layout/header.d.ts +0 -4
  308. package/dist/ikoncomponents/main-layout/header.d.ts.map +0 -1
  309. package/dist/ikoncomponents/main-layout/header.js +0 -15
  310. package/dist/ikoncomponents/main-layout/index.d.ts +0 -7
  311. package/dist/ikoncomponents/main-layout/index.d.ts.map +0 -1
  312. package/dist/ikoncomponents/main-layout/index.js +0 -12
  313. package/dist/ikoncomponents/main-layout/main-sidebar.d.ts +0 -61
  314. package/dist/ikoncomponents/main-layout/main-sidebar.d.ts.map +0 -1
  315. package/dist/ikoncomponents/main-layout/main-sidebar.js +0 -119
  316. package/dist/ikoncomponents/main-layout/nav-main.d.ts +0 -12
  317. package/dist/ikoncomponents/main-layout/nav-main.d.ts.map +0 -1
  318. package/dist/ikoncomponents/main-layout/nav-main.js +0 -33
  319. package/dist/ikoncomponents/multi-combobox/index.d.ts +0 -14
  320. package/dist/ikoncomponents/multi-combobox/index.d.ts.map +0 -1
  321. package/dist/ikoncomponents/multi-combobox/index.js +0 -202
  322. package/dist/ikoncomponents/no-data/index.d.ts +0 -4
  323. package/dist/ikoncomponents/no-data/index.d.ts.map +0 -1
  324. package/dist/ikoncomponents/no-data/index.js +0 -5
  325. package/dist/ikoncomponents/page-wrapper/index.d.ts +0 -10
  326. package/dist/ikoncomponents/page-wrapper/index.d.ts.map +0 -1
  327. package/dist/ikoncomponents/page-wrapper/index.js +0 -7
  328. package/dist/ikoncomponents/password-strength-meter/index.d.ts +0 -4
  329. package/dist/ikoncomponents/password-strength-meter/index.d.ts.map +0 -1
  330. package/dist/ikoncomponents/password-strength-meter/index.js +0 -40
  331. package/dist/ikoncomponents/phone-input/index.d.ts +0 -2
  332. package/dist/ikoncomponents/phone-input/index.d.ts.map +0 -1
  333. package/dist/ikoncomponents/phone-input/index.js +0 -41
  334. package/dist/ikoncomponents/provider-wrapper/index.d.ts +0 -7
  335. package/dist/ikoncomponents/provider-wrapper/index.d.ts.map +0 -1
  336. package/dist/ikoncomponents/provider-wrapper/index.js +0 -10
  337. package/dist/ikoncomponents/search-input/index.d.ts +0 -2
  338. package/dist/ikoncomponents/search-input/index.d.ts.map +0 -1
  339. package/dist/ikoncomponents/search-input/index.js +0 -19
  340. package/dist/ikoncomponents/sheet/index.d.ts +0 -11
  341. package/dist/ikoncomponents/sheet/index.d.ts.map +0 -1
  342. package/dist/ikoncomponents/sheet/index.js +0 -6
  343. package/dist/ikoncomponents/simple-widget/index.d.ts +0 -15
  344. package/dist/ikoncomponents/simple-widget/index.d.ts.map +0 -1
  345. package/dist/ikoncomponents/simple-widget/index.js +0 -14
  346. package/dist/ikoncomponents/skeleton-loader/skeleton-table.d.ts +0 -6
  347. package/dist/ikoncomponents/skeleton-loader/skeleton-table.d.ts.map +0 -1
  348. package/dist/ikoncomponents/skeleton-loader/skeleton-table.js +0 -6
  349. package/dist/ikoncomponents/skeleton-loader/skeleton-widget.d.ts +0 -4
  350. package/dist/ikoncomponents/skeleton-loader/skeleton-widget.d.ts.map +0 -1
  351. package/dist/ikoncomponents/skeleton-loader/skeleton-widget.js +0 -5
  352. package/dist/ikoncomponents/tabs/index.d.ts +0 -3
  353. package/dist/ikoncomponents/tabs/index.d.ts.map +0 -1
  354. package/dist/ikoncomponents/tabs/index.js +0 -50
  355. package/dist/ikoncomponents/tabs/type.d.ts.map +0 -1
  356. package/dist/ikoncomponents/tabs/type.js +0 -2
  357. package/dist/ikoncomponents/theme-toggle-btn/index.d.ts +0 -2
  358. package/dist/ikoncomponents/theme-toggle-btn/index.d.ts.map +0 -1
  359. package/dist/ikoncomponents/title-progress/index.d.ts +0 -13
  360. package/dist/ikoncomponents/title-progress/index.d.ts.map +0 -1
  361. package/dist/ikoncomponents/title-progress/index.js +0 -10
  362. package/dist/ikoncomponents/tooltip/index.d.ts +0 -6
  363. package/dist/ikoncomponents/tooltip/index.d.ts.map +0 -1
  364. package/dist/ikoncomponents/tooltip/index.js +0 -5
  365. package/dist/ikoncomponents/twolevel-dropdown/convertToDropdownNodes.d.ts +0 -10
  366. package/dist/ikoncomponents/twolevel-dropdown/convertToDropdownNodes.d.ts.map +0 -1
  367. package/dist/ikoncomponents/twolevel-dropdown/convertToDropdownNodes.js +0 -24
  368. package/dist/ikoncomponents/twolevel-dropdown/index.d.ts +0 -32
  369. package/dist/ikoncomponents/twolevel-dropdown/index.d.ts.map +0 -1
  370. package/dist/ikoncomponents/twolevel-dropdown/index.js +0 -143
  371. package/dist/ikoncomponents/upload-tab/index.d.ts +0 -2
  372. package/dist/ikoncomponents/upload-tab/index.d.ts.map +0 -1
  373. package/dist/ikoncomponents/upload-tab/index.js +0 -92
  374. package/dist/ikoncomponents/widgets/index.d.ts +0 -3
  375. package/dist/ikoncomponents/widgets/index.d.ts.map +0 -1
  376. package/dist/ikoncomponents/widgets/index.js +0 -14
  377. package/dist/ikoncomponents/widgets/type.d.ts +0 -11
  378. package/dist/ikoncomponents/widgets/type.d.ts.map +0 -1
  379. package/dist/ikoncomponents/widgets/type.js +0 -2
  380. package/dist/ikoncomponents/work-in-progress/index.d.ts +0 -2
  381. package/dist/ikoncomponents/work-in-progress/index.d.ts.map +0 -1
  382. package/dist/ikoncomponents/work-in-progress/index.js +0 -4
  383. package/dist/index.d.ts.map +0 -1
  384. package/dist/shadcn/accordion.d.ts +0 -8
  385. package/dist/shadcn/accordion.d.ts.map +0 -1
  386. package/dist/shadcn/accordion.js +0 -33
  387. package/dist/shadcn/alert-dialog.d.ts +0 -21
  388. package/dist/shadcn/alert-dialog.d.ts.map +0 -1
  389. package/dist/shadcn/alert-dialog.js +0 -83
  390. package/dist/shadcn/alert.d.ts +0 -10
  391. package/dist/shadcn/alert.d.ts.map +0 -1
  392. package/dist/shadcn/alert.js +0 -38
  393. package/dist/shadcn/aspect-ratio.d.ts +0 -4
  394. package/dist/shadcn/aspect-ratio.d.ts.map +0 -1
  395. package/dist/shadcn/aspect-ratio.js +0 -19
  396. package/dist/shadcn/avatar.d.ts +0 -7
  397. package/dist/shadcn/avatar.d.ts.map +0 -1
  398. package/dist/shadcn/avatar.js +0 -28
  399. package/dist/shadcn/badge.d.ts +0 -10
  400. package/dist/shadcn/badge.d.ts.map +0 -1
  401. package/dist/shadcn/badge.js +0 -35
  402. package/dist/shadcn/breadcrumb.d.ts +0 -12
  403. package/dist/shadcn/breadcrumb.d.ts.map +0 -1
  404. package/dist/shadcn/breadcrumb.js +0 -45
  405. package/dist/shadcn/button.d.ts +0 -11
  406. package/dist/shadcn/button.d.ts.map +0 -1
  407. package/dist/shadcn/button.js +0 -47
  408. package/dist/shadcn/calendar.d.ts +0 -9
  409. package/dist/shadcn/calendar.d.ts.map +0 -1
  410. package/dist/shadcn/calendar.js +0 -61
  411. package/dist/shadcn/card.d.ts +0 -10
  412. package/dist/shadcn/card.d.ts.map +0 -1
  413. package/dist/shadcn/card.js +0 -42
  414. package/dist/shadcn/checkbox.d.ts +0 -5
  415. package/dist/shadcn/checkbox.d.ts.map +0 -1
  416. package/dist/shadcn/checkbox.js +0 -21
  417. package/dist/shadcn/collapsible.d.ts +0 -6
  418. package/dist/shadcn/collapsible.d.ts.map +0 -1
  419. package/dist/shadcn/collapsible.js +0 -27
  420. package/dist/shadcn/command.d.ts +0 -19
  421. package/dist/shadcn/command.d.ts.map +0 -1
  422. package/dist/shadcn/command.js +0 -54
  423. package/dist/shadcn/date-input.d.ts +0 -8
  424. package/dist/shadcn/date-input.d.ts.map +0 -1
  425. package/dist/shadcn/date-input.js +0 -179
  426. package/dist/shadcn/date-range-picker.d.ts +0 -25
  427. package/dist/shadcn/date-range-picker.d.ts.map +0 -1
  428. package/dist/shadcn/date-range-picker.js +0 -45
  429. package/dist/shadcn/dialog.d.ts +0 -16
  430. package/dist/shadcn/dialog.d.ts.map +0 -1
  431. package/dist/shadcn/dialog.js +0 -57
  432. package/dist/shadcn/drawer.d.ts +0 -14
  433. package/dist/shadcn/drawer.d.ts.map +0 -1
  434. package/dist/shadcn/drawer.js +0 -56
  435. package/dist/shadcn/dropdown-menu.d.ts +0 -26
  436. package/dist/shadcn/dropdown-menu.d.ts.map +0 -1
  437. package/dist/shadcn/dropdown-menu.js +0 -77
  438. package/dist/shadcn/form.d.ts +0 -25
  439. package/dist/shadcn/form.d.ts.map +0 -1
  440. package/dist/shadcn/form.js +0 -70
  441. package/dist/shadcn/hover-card.d.ts +0 -7
  442. package/dist/shadcn/hover-card.d.ts.map +0 -1
  443. package/dist/shadcn/hover-card.js +0 -28
  444. package/dist/shadcn/input-otp.d.ts +0 -35
  445. package/dist/shadcn/input-otp.d.ts.map +0 -1
  446. package/dist/shadcn/input-otp.js +0 -40
  447. package/dist/shadcn/input.d.ts +0 -4
  448. package/dist/shadcn/input.d.ts.map +0 -1
  449. package/dist/shadcn/input.js +0 -18
  450. package/dist/shadcn/label.d.ts +0 -5
  451. package/dist/shadcn/label.d.ts.map +0 -1
  452. package/dist/shadcn/label.js +0 -20
  453. package/dist/shadcn/navigation-menu.d.ts +0 -17
  454. package/dist/shadcn/navigation-menu.d.ts.map +0 -1
  455. package/dist/shadcn/navigation-menu.js +0 -74
  456. package/dist/shadcn/popover.d.ts +0 -8
  457. package/dist/shadcn/popover.d.ts.map +0 -1
  458. package/dist/shadcn/popover.js +0 -32
  459. package/dist/shadcn/progress.d.ts +0 -9
  460. package/dist/shadcn/progress.d.ts.map +0 -1
  461. package/dist/shadcn/progress.js +0 -23
  462. package/dist/shadcn/radio-group.d.ts +0 -6
  463. package/dist/shadcn/radio-group.d.ts.map +0 -1
  464. package/dist/shadcn/radio-group.js +0 -25
  465. package/dist/shadcn/scroll-area.d.ts +0 -6
  466. package/dist/shadcn/scroll-area.d.ts.map +0 -1
  467. package/dist/shadcn/scroll-area.js +0 -26
  468. package/dist/shadcn/select.d.ts +0 -16
  469. package/dist/shadcn/select.d.ts.map +0 -1
  470. package/dist/shadcn/select.js +0 -59
  471. package/dist/shadcn/separator.d.ts +0 -5
  472. package/dist/shadcn/separator.d.ts.map +0 -1
  473. package/dist/shadcn/separator.js +0 -20
  474. package/dist/shadcn/sheet.d.ts +0 -14
  475. package/dist/shadcn/sheet.d.ts.map +0 -1
  476. package/dist/shadcn/sheet.js +0 -61
  477. package/dist/shadcn/sidebar.d.ts +0 -70
  478. package/dist/shadcn/sidebar.d.ts.map +0 -1
  479. package/dist/shadcn/sidebar.js +0 -242
  480. package/dist/shadcn/skeleton.d.ts +0 -4
  481. package/dist/shadcn/skeleton.d.ts.map +0 -1
  482. package/dist/shadcn/skeleton.js +0 -18
  483. package/dist/shadcn/slider.d.ts +0 -5
  484. package/dist/shadcn/slider.d.ts.map +0 -1
  485. package/dist/shadcn/slider.js +0 -26
  486. package/dist/shadcn/sonner.d.ts +0 -4
  487. package/dist/shadcn/sonner.d.ts.map +0 -1
  488. package/dist/shadcn/sonner.js +0 -25
  489. package/dist/shadcn/switch.d.ts +0 -5
  490. package/dist/shadcn/switch.d.ts.map +0 -1
  491. package/dist/shadcn/switch.js +0 -20
  492. package/dist/shadcn/table.d.ts +0 -11
  493. package/dist/shadcn/table.d.ts.map +0 -1
  494. package/dist/shadcn/table.js +0 -47
  495. package/dist/shadcn/tabs.d.ts +0 -8
  496. package/dist/shadcn/tabs.d.ts.map +0 -1
  497. package/dist/shadcn/tabs.js +0 -32
  498. package/dist/shadcn/textarea.d.ts +0 -4
  499. package/dist/shadcn/textarea.d.ts.map +0 -1
  500. package/dist/shadcn/textarea.js +0 -18
  501. package/dist/shadcn/toggle-group.d.ts +0 -10
  502. package/dist/shadcn/toggle-group.d.ts.map +0 -1
  503. package/dist/shadcn/toggle-group.js +0 -35
  504. package/dist/shadcn/toggle.d.ts +0 -10
  505. package/dist/shadcn/toggle.d.ts.map +0 -1
  506. package/dist/shadcn/toggle.js +0 -38
  507. package/dist/shadcn/tooltip.d.ts +0 -8
  508. package/dist/shadcn/tooltip.d.ts.map +0 -1
  509. package/dist/shadcn/tooltip.js +0 -32
  510. package/dist/shadcn/workflow.d.ts +0 -21
  511. package/dist/shadcn/workflow.d.ts.map +0 -1
  512. package/dist/shadcn/workflow.js +0 -20
  513. package/dist/styles.css +0 -1302
  514. package/dist/utils/actions/account/index.d.ts +0 -6
  515. package/dist/utils/actions/account/index.d.ts.map +0 -1
  516. package/dist/utils/actions/account/index.js +0 -28
  517. package/dist/utils/actions/account/type.d.ts +0 -5
  518. package/dist/utils/actions/account/type.d.ts.map +0 -1
  519. package/dist/utils/actions/account/type.js +0 -1
  520. package/dist/utils/actions/auth/index.d.ts +0 -8
  521. package/dist/utils/actions/auth/index.d.ts.map +0 -1
  522. package/dist/utils/actions/common/revalidate.d.ts +0 -3
  523. package/dist/utils/actions/common/revalidate.d.ts.map +0 -1
  524. package/dist/utils/actions/common/revalidate.js +0 -14
  525. package/dist/utils/actions/common/type.d.ts +0 -5
  526. package/dist/utils/actions/common/type.d.ts.map +0 -1
  527. package/dist/utils/actions/common/type.js +0 -1
  528. package/dist/utils/actions/common/utils.d.ts +0 -6
  529. package/dist/utils/actions/common/utils.d.ts.map +0 -1
  530. package/dist/utils/actions/software/index.d.ts +0 -12
  531. package/dist/utils/actions/software/index.d.ts.map +0 -1
  532. package/dist/utils/actions/software/index.js +0 -75
  533. package/dist/utils/api/accountService/index.d.ts +0 -24
  534. package/dist/utils/api/accountService/index.d.ts.map +0 -1
  535. package/dist/utils/api/accountService/index.js +0 -64
  536. package/dist/utils/api/accountService/type.d.ts +0 -5
  537. package/dist/utils/api/accountService/type.d.ts.map +0 -1
  538. package/dist/utils/api/accountService/type.js +0 -1
  539. package/dist/utils/api/file-upload/index.d.ts +0 -6
  540. package/dist/utils/api/file-upload/index.d.ts.map +0 -1
  541. package/dist/utils/api/file-upload/index.js +0 -80
  542. package/dist/utils/api/file-upload/type.d.ts +0 -7
  543. package/dist/utils/api/file-upload/type.d.ts.map +0 -1
  544. package/dist/utils/api/file-upload/type.js +0 -1
  545. package/dist/utils/api/ikonBaseApi.d.ts +0 -13
  546. package/dist/utils/api/ikonBaseApi.d.ts.map +0 -1
  547. package/dist/utils/api/loginService/index.d.ts +0 -13
  548. package/dist/utils/api/loginService/index.d.ts.map +0 -1
  549. package/dist/utils/api/loginService/index.js +0 -72
  550. package/dist/utils/api/loginService/type.d.ts.map +0 -1
  551. package/dist/utils/api/loginService/type.js +0 -1
  552. package/dist/utils/api/softwareService/index.d.ts +0 -65
  553. package/dist/utils/api/softwareService/index.d.ts.map +0 -1
  554. package/dist/utils/api/softwareService/index.js +0 -212
  555. package/dist/utils/api/softwareService/type.d.ts +0 -55
  556. package/dist/utils/api/softwareService/type.d.ts.map +0 -1
  557. package/dist/utils/api/softwareService/type.js +0 -1
  558. package/dist/utils/border-radius-provider.d.ts +0 -12
  559. package/dist/utils/border-radius-provider.d.ts.map +0 -1
  560. package/dist/utils/cn.d.ts +0 -3
  561. package/dist/utils/cn.d.ts.map +0 -1
  562. package/dist/utils/cn.js +0 -5
  563. package/dist/utils/font-provider.d.ts +0 -12
  564. package/dist/utils/font-provider.d.ts.map +0 -1
  565. package/dist/utils/session/cookieSession.d.ts +0 -9
  566. package/dist/utils/session/cookieSession.d.ts.map +0 -1
  567. package/dist/utils/session/cookieSession.js +0 -33
  568. package/dist/utils/theme-provider/index.d.ts +0 -4
  569. package/dist/utils/theme-provider/index.d.ts.map +0 -1
  570. package/dist/utils/theme-provider/index.js +0 -18
  571. package/dist/utils/token-management/index.d.ts +0 -11
  572. package/dist/utils/token-management/index.d.ts.map +0 -1
  573. package/dist/utils/token-management/index.js +0 -69
  574. package/dist/utils/token-management/types.d.ts +0 -7
  575. package/dist/utils/token-management/types.d.ts.map +0 -1
  576. package/dist/utils/token-management/types.js +0 -1
@@ -1,381 +1,574 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- // import {
3
- // FormControl,
4
- // FormDescription,
5
- // FormField,
6
- // FormItem,
7
- // FormLabel,
8
- // FormMessage,
9
- // } from "@/shadcn/ui/form";
10
- // import React, { useState, useEffect, useRef, useCallback } from "react";
11
- // // import { FormComboboxInputProps } from "@/ikon/components/form-fields/types";
12
- // import { Popover, PopoverContent, PopoverTrigger } from "@/shadcn/ui/popover";
13
- // import { Button } from "@/shadcn/ui/button";
14
- // import { cn } from "@/shadcn/lib/utils";
15
- // import { Check, ChevronsUpDown } from "lucide-react";
16
- // import {
17
- // Command,
18
- // CommandEmpty,
19
- // CommandGroup,
20
- // CommandInput,
21
- // CommandItem,
22
- // CommandList,
23
- // } from "@/shadcn/ui/command";
24
- // import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/shadcn/ui/tooltip";
25
- // import { X } from "lucide-react";
26
- // import { FormComboboxInputProps as BaseFormComboboxInputProps } from "@/ikon/components/form-fields/types";
27
- // interface FormComboboxInputProps extends BaseFormComboboxInputProps {
28
- // defaultOptions?: number; // Add defaultOptions to the type
29
- // }
30
- // export default function dFormMultiComboboxInput({
31
- // formControl,
32
- // name,
33
- // label,
34
- // placeholder,
35
- // formDescription,
36
- // items = [], // fallback to empty array
37
- // disabled,
38
- // onSelect,
39
- // defaultValue = [],
40
- // defaultOptions = 2,
41
- // }: FormComboboxInputProps) {
42
- // const [search, setSearch] = useState("");
43
- // const containerRef = useRef<HTMLDivElement>(null);
44
- // // Filter items based on search
45
- // const filteredItems = items.filter((item) =>
46
- // item.label?.toLowerCase().includes(search.toLowerCase())
47
- // )
48
- // .sort((a, b) => (a?.label ?? "").localeCompare(b?.label ?? ""));
49
- // return (
50
- // <FormField
51
- // control={formControl}
52
- // name={name}
53
- // render={({ field }) => {
54
- // // Initialize defaultValue if field.value is undefined
55
- // useEffect(() => {
56
- // if (
57
- // (field.value === undefined || field.value === null) &&
58
- // defaultValue.length > 0
59
- // ) {
60
- // field.onChange(defaultValue);
61
- // }
62
- // }, [defaultValue, field]);
63
- // // field.value is the selected array, default to [] if undefined
64
- // const selectedItems = field.value || [];
65
- // const [visibleCount, setVisibleCount] = useState(selectedItems.length);
66
- // const calculateVisibleItems = useCallback(() => {
67
- // const container = containerRef.current;
68
- // if (!container) return visibleCount;
69
- // const children = Array.from(container.children) as HTMLElement[];
70
- // let availableWidth = container.offsetWidth;
71
- // let usedWidth = 0;
72
- // let fitCount = 0;
73
- // for (const child of children) {
74
- // const childWidth = child.offsetWidth + 4; // gap/margin
75
- // if (usedWidth + childWidth <= availableWidth) {
76
- // usedWidth += childWidth;
77
- // fitCount++;
78
- // } else {
79
- // break;
80
- // }
81
- // }
82
- // return fitCount;
83
- // }, []); // No dependencies
84
- // useEffect(() => {
85
- // const container = containerRef.current;
86
- // if (!container) return;
87
- // let animationFrameId: number | null = null;
88
- // const resizeObserver = new ResizeObserver(() => {
89
- // if (animationFrameId) cancelAnimationFrame(animationFrameId);
90
- // animationFrameId = requestAnimationFrame(() => {
91
- // const newVisibleCount = calculateVisibleItems();
92
- // setVisibleCount((prevVisibleCount: number) => {
93
- // if (prevVisibleCount !== newVisibleCount) {
94
- // return newVisibleCount;
95
- // }
96
- // return prevVisibleCount;
97
- // });
98
- // });
99
- // });
100
- // resizeObserver.observe(container);
101
- // // Initial calculation
102
- // setVisibleCount(calculateVisibleItems());
103
- // // Cleanup
104
- // return () => {
105
- // if (animationFrameId) cancelAnimationFrame(animationFrameId);
106
- // resizeObserver.disconnect();
107
- // };
108
- // }, [calculateVisibleItems]); // Only depend on calculateVisibleItems
109
- // // Toggle select/unselect item
110
- // const toggleItem = (value: string) => {
111
- // let updatedItems;
112
- // if (selectedItems.includes(value)) {
113
- // updatedItems = selectedItems.filter((v: string) => v !== value);
114
- // } else {
115
- // updatedItems = [...selectedItems, value];
116
- // }
117
- // field.onChange(updatedItems);
118
- // onSelect && onSelect(updatedItems);
119
- // };
120
- // const onWheel = (e: React.WheelEvent<HTMLDivElement>) => {
121
- // const el = e.currentTarget;
122
- // el.scrollTop += e.deltaY; // manually scroll
123
- // e.preventDefault(); // prevent parent scroll
124
- // };
125
- // return (
126
- // <FormItem>
127
- // {label && <FormLabel>{label}</FormLabel>}
128
- // <Popover>
129
- // <PopoverTrigger asChild className="w-full">
130
- // <FormControl>
131
- // <Button
132
- // variant="outline"
133
- // role="combobox"
134
- // className={cn(
135
- // "justify-between",
136
- // !selectedItems.length && "text-foreground/50"
137
- // )}
138
- // disabled={
139
- // disabled === true || (disabled && disabled(...arguments))
140
- // }
141
- // >
142
- // {selectedItems.length > 0 ? (
143
- // <TooltipProvider>
144
- // <div ref={containerRef} className="flex flex-wrap gap-2 items-center overflow-hidden">
145
- // {selectedItems.slice(0, defaultOptions).map((value: string) => {
146
- // const label = items.find((item) => item.value === value)?.label || value;
147
- // return (
148
- // <span
149
- // key={value}
150
- // className="flex items-center px-2 py-1 bg-secondary text-secondary-foreground rounded-md truncate max-w-full"
151
- // title={label}
152
- // >
153
- // <span className="truncate max-w-[120px]">{label}</span>
154
- // <span
155
- // role="button"
156
- // tabIndex={0}
157
- // onClick={(e) => {
158
- // e.stopPropagation(); // prevent popover toggle
159
- // const updated = selectedItems.filter((v: string) => v !== value);
160
- // field.onChange(updated);
161
- // onSelect && onSelect(updated);
162
- // }}
163
- // onKeyDown={(e) => {
164
- // if (e.key === 'Enter' || e.key === ' ') {
165
- // e.preventDefault();
166
- // e.stopPropagation();
167
- // const updated = selectedItems.filter((v: string) => v !== value);
168
- // field.onChange(updated);
169
- // onSelect && onSelect(updated);
170
- // }
171
- // }}
172
- // className="ml-1 text-muted-foreground hover:text-destructive cursor-pointer outline-none"
173
- // >
174
- // <X className="w-3 h-3 ml-1" />
175
- // </span>
176
- // </span>
177
- // );
178
- // })}
179
- // {selectedItems.length > defaultOptions && (
180
- // <Tooltip>
181
- // <TooltipTrigger asChild>
182
- // <span className="px-2 py-1 bg-secondary text-secondary-foreground rounded-md cursor-pointer">
183
- // +{selectedItems.length - defaultOptions} more
184
- // </span>
185
- // </TooltipTrigger>
186
- // <TooltipContent className="max-w-xs break-words">
187
- // <div
188
- // onWheel={onWheel}
189
- // className="flex flex-col gap-1 max-h-[200px] overflow-auto"
190
- // >
191
- // {selectedItems.slice(defaultOptions).map((value: string) => (
192
- // <span key={value} className="text-sm">
193
- // {items.find((item) => item.value === value)?.label || value}
194
- // </span>
195
- // ))}
196
- // </div>
197
- // </TooltipContent>
198
- // </Tooltip>
199
- // )}
200
- // </div>
201
- // </TooltipProvider>
202
- // ) : (
203
- // placeholder
204
- // )}
205
- // <ChevronsUpDown className="opacity-50" />
206
- // </Button>
207
- // </FormControl>
208
- // </PopoverTrigger>
209
- // <PopoverContent id="multiSelectPopover" className="p-0 w-full max-w-[300px]" align="start">
210
- // <Command id="commandPopover">
211
- // <CommandInput
212
- // placeholder="Search..."
213
- // value={search}
214
- // onValueChange={setSearch}
215
- // autoFocus
216
- // />
217
- // <CommandList
218
- // className="max-h-60 overflow-auto"
219
- // onWheel={onWheel}
220
- // >
221
- // <CommandEmpty>No items found.</CommandEmpty>
222
- // <CommandGroup>
223
- // {filteredItems.map((item) => {
224
- // const isSelected = selectedItems.includes(item.value);
225
- // return (
226
- // <CommandItem
227
- // value={item.label ?? ""}
228
- // key={item.value}
229
- // onSelect={() => toggleItem(item.value)}
230
- // >
231
- // {item.label}
232
- // <Check
233
- // className={cn(
234
- // "ml-auto",
235
- // isSelected ? "opacity-100" : "opacity-0"
236
- // )}
237
- // />
238
- // </CommandItem>
239
- // );
240
- // })}
241
- // </CommandGroup>
242
- // </CommandList>
243
- // </Command>
244
- // </PopoverContent>
245
- // </Popover>
246
- // {formDescription && (
247
- // <FormDescription>{formDescription}</FormDescription>
248
- // )}
249
- // <FormMessage />
250
- // </FormItem>
251
- // );
252
- // }}
253
- // />
254
- // );
255
- // }
256
- import { FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "../../../shadcn/form";
257
- import { useState, useEffect, useRef, useCallback } from "react";
258
- import { Popover, PopoverContent, PopoverTrigger } from "../../../shadcn/popover";
259
- import { Button } from "../../../shadcn/button";
260
- import { cn } from "../../../utils/cn";
261
- import { ChevronsUpDown, X } from "lucide-react";
262
- import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, } from "../../../shadcn/command";
263
- import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "../../../shadcn/tooltip";
264
- import { Checkbox } from "../../../shadcn/checkbox";
265
- export function FormMultiComboboxInput({ formControl, name, label, placeholder, formDescription, items = [], disabled, onSelect, defaultValue = [], defaultOptions = 2, }) {
266
- const [search, setSearch] = useState("");
267
- const containerRef = useRef(null);
268
- // Removed triggerRef and popoverWidth state, as we'll rely on CSS variables for sizing
269
- // Filter items based on search
270
- const filteredItems = items
271
- .filter((item) => { var _a; return (_a = item.label) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes(search.toLowerCase()); })
272
- .sort((a, b) => { var _a, _b; return ((_a = a === null || a === void 0 ? void 0 : a.label) !== null && _a !== void 0 ? _a : "").localeCompare((_b = b === null || b === void 0 ? void 0 : b.label) !== null && _b !== void 0 ? _b : ""); });
273
- return (_jsx(FormField, { control: formControl, name: name, render: ({ field }) => {
274
- useEffect(() => {
275
- if ((field.value === undefined || field.value === null) &&
276
- defaultValue.length > 0) {
277
- field.onChange(defaultValue);
278
- }
279
- }, [defaultValue, field]);
280
- const selectedItems = field.value || [];
281
- const [visibleCount, setVisibleCount] = useState(selectedItems.length);
282
- const calculateVisibleItems = useCallback(() => {
283
- const container = containerRef.current;
284
- if (!container)
285
- return visibleCount;
286
- const children = Array.from(container.children);
287
- let availableWidth = container.offsetWidth;
288
- let usedWidth = 0;
289
- let fitCount = 0;
290
- for (const child of children) {
291
- const childWidth = child.offsetWidth + 4; // gap/margin
292
- if (usedWidth + childWidth <= availableWidth) {
293
- usedWidth += childWidth;
294
- fitCount++;
295
- }
296
- else {
297
- break;
298
- }
299
- }
300
- return fitCount;
301
- }, [visibleCount]);
302
- useEffect(() => {
303
- const container = containerRef.current;
304
- if (!container)
305
- return;
306
- let animationFrameId = null;
307
- const resizeObserver = new ResizeObserver(() => {
308
- if (animationFrameId)
309
- cancelAnimationFrame(animationFrameId);
310
- animationFrameId = requestAnimationFrame(() => {
311
- const newVisibleCount = calculateVisibleItems();
312
- setVisibleCount((prevVisibleCount) => {
313
- if (prevVisibleCount !== newVisibleCount) {
314
- return newVisibleCount;
315
- }
316
- return prevVisibleCount;
317
- });
318
- });
319
- });
320
- resizeObserver.observe(container);
321
- setVisibleCount(calculateVisibleItems());
322
- return () => {
323
- if (animationFrameId)
324
- cancelAnimationFrame(animationFrameId);
325
- resizeObserver.disconnect();
326
- };
327
- }, [calculateVisibleItems]);
328
- const toggleItem = (value) => {
329
- let updatedItems;
330
- if (selectedItems.includes(value)) {
331
- updatedItems = selectedItems.filter((v) => v !== value);
332
- }
333
- else {
334
- updatedItems = [...selectedItems, value];
335
- }
336
- field.onChange(updatedItems);
337
- onSelect && onSelect(updatedItems);
338
- };
339
- const onWheel = (e) => {
340
- const el = e.currentTarget;
341
- el.scrollTop += e.deltaY;
342
- e.preventDefault();
343
- };
344
- return (_jsxs(FormItem, { children: [label && _jsx(FormLabel, { children: label }), _jsxs(Popover, { children: [_jsx(PopoverTrigger, { asChild: true, className: "w-full", children: _jsx(FormControl, { children: _jsxs(Button
345
- // Removed ref={triggerRef} here as it's no longer needed for explicit width measurement
346
- , {
347
- // Removed ref={triggerRef} here as it's no longer needed for explicit width measurement
348
- variant: "outline", role: "combobox", className: cn("justify-between", !selectedItems.length && "text-foreground/50"), disabled: disabled === true || (disabled && disabled(...arguments)), children: [selectedItems.length > 0 ? (_jsx(TooltipProvider, { children: _jsxs("div", { ref: containerRef, className: "flex flex-wrap gap-2 items-center overflow-hidden", children: [selectedItems.slice(0, defaultOptions).map((value) => {
349
- var _a;
350
- const label = ((_a = items.find((item) => item.value === value)) === null || _a === void 0 ? void 0 : _a.label) ||
351
- value;
352
- return (_jsxs("span", { className: "flex items-center px-2 py-1 bg-secondary text-secondary-foreground rounded-md truncate max-w-full", title: label, children: [_jsx("span", { className: "truncate max-w-[120px]", children: label }), _jsx("span", { role: "button", tabIndex: 0, onClick: (e) => {
353
- e.stopPropagation();
354
- const updated = selectedItems.filter((v) => v !== value);
355
- field.onChange(updated);
356
- onSelect && onSelect(updated);
357
- }, onKeyDown: (e) => {
358
- if (e.key === "Enter" || e.key === " ") {
359
- e.preventDefault();
360
- e.stopPropagation();
361
- const updated = selectedItems.filter((v) => v !== value);
362
- field.onChange(updated);
363
- onSelect && onSelect(updated);
364
- }
365
- }, className: "ml-1 text-muted-foreground hover:text-destructive cursor-pointer outline-none", children: _jsx(X, { className: "w-3 h-3 ml-1" }) })] }, value));
366
- }), selectedItems.length > defaultOptions && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("span", { className: "px-2 py-1 bg-secondary text-secondary-foreground rounded-md cursor-pointer", children: ["+", selectedItems.length - defaultOptions, " more"] }) }), _jsx(TooltipContent, { className: "max-w-xs break-words", children: _jsx("div", { onWheel: onWheel, className: "flex flex-col gap-1 max-h-[200px] overflow-auto", children: selectedItems.slice(defaultOptions).map((value) => {
367
- var _a;
368
- return (_jsx("span", { className: "text-sm", children: ((_a = items.find((item) => item.value === value)) === null || _a === void 0 ? void 0 : _a.label) || value }, value));
369
- }) }) })] }))] }) })) : (placeholder), _jsx(ChevronsUpDown, { className: "opacity-50" })] }) }) }), _jsx(PopoverContent, { id: "multiSelectPopover",
370
- // New and improved width logic for PopoverContent
371
- className: "p-0 min-w-[--radix-popover-trigger-width]" // Ensures at least trigger width
372
- , style: {
373
- width: 'max-content', // Allow to grow with content
374
- maxWidth: 'min(500px, 90vw)' // Cap at 500px or 90% of viewport width, whichever is smaller
375
- }, align: "start", children: _jsxs(Command, { id: "commandPopover", children: [_jsx(CommandInput, { placeholder: "Search...", value: search, onValueChange: setSearch, autoFocus: true }), _jsxs(CommandList, { className: "max-h-60 overflow-auto", onWheel: onWheel, children: [_jsx(CommandEmpty, { children: "No items found." }), _jsx(CommandGroup, { children: filteredItems.map((item) => {
376
- var _a;
377
- const isSelected = selectedItems.includes(item.value);
378
- return (_jsxs(CommandItem, { value: (_a = item.label) !== null && _a !== void 0 ? _a : "", onSelect: () => toggleItem(item.value), className: "flex items-center space-x-2 justify-start", children: [_jsx(Checkbox, { checked: isSelected, onCheckedChange: () => toggleItem(item.value), onClick: (e) => e.stopPropagation() }), _jsx("span", { children: item.label })] }, item.value));
379
- }) })] })] }) })] }), formDescription && (_jsx(FormDescription, { children: formDescription })), _jsx(FormMessage, {})] }));
380
- } }));
381
- }
1
+ // import {
2
+ // FormControl,
3
+ // FormDescription,
4
+ // FormField,
5
+ // FormItem,
6
+ // FormLabel,
7
+ // FormMessage,
8
+ // } from "@/shadcn/ui/form";
9
+ // import React, { useState, useEffect, useRef, useCallback } from "react";
10
+ // // import { FormComboboxInputProps } from "@/ikon/components/form-fields/types";
11
+ // import { Popover, PopoverContent, PopoverTrigger } from "@/shadcn/ui/popover";
12
+ // import { Button } from "@/shadcn/ui/button";
13
+ // import { cn } from "@/shadcn/lib/utils";
14
+ // import { Check, ChevronsUpDown } from "lucide-react";
15
+ // import {
16
+ // Command,
17
+ // CommandEmpty,
18
+ // CommandGroup,
19
+ // CommandInput,
20
+ // CommandItem,
21
+ // CommandList,
22
+ // } from "@/shadcn/ui/command";
23
+ // import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/shadcn/ui/tooltip";
24
+ // import { X } from "lucide-react";
25
+ // import { FormComboboxInputProps as BaseFormComboboxInputProps } from "@/ikon/components/form-fields/types";
26
+
27
+ // interface FormComboboxInputProps extends BaseFormComboboxInputProps {
28
+ // defaultOptions?: number; // Add defaultOptions to the type
29
+ // }
30
+ // export default function dFormMultiComboboxInput({
31
+ // formControl,
32
+ // name,
33
+ // label,
34
+ // placeholder,
35
+ // formDescription,
36
+ // items = [], // fallback to empty array
37
+ // disabled,
38
+ // onSelect,
39
+ // defaultValue = [],
40
+ // defaultOptions = 2,
41
+ // }: FormComboboxInputProps) {
42
+ // const [search, setSearch] = useState("");
43
+ // const containerRef = useRef<HTMLDivElement>(null);
44
+
45
+
46
+ // // Filter items based on search
47
+ // const filteredItems = items.filter((item) =>
48
+ // item.label?.toLowerCase().includes(search.toLowerCase())
49
+ // )
50
+ // .sort((a, b) => (a?.label ?? "").localeCompare(b?.label ?? ""));
51
+
52
+
53
+
54
+ // return (
55
+ // <FormField
56
+ // control={formControl}
57
+ // name={name}
58
+ // render={({ field }) => {
59
+ // // Initialize defaultValue if field.value is undefined
60
+ // useEffect(() => {
61
+ // if (
62
+ // (field.value === undefined || field.value === null) &&
63
+ // defaultValue.length > 0
64
+ // ) {
65
+ // field.onChange(defaultValue);
66
+ // }
67
+ // }, [defaultValue, field]);
68
+
69
+ // // field.value is the selected array, default to [] if undefined
70
+ // const selectedItems = field.value || [];
71
+ // const [visibleCount, setVisibleCount] = useState(selectedItems.length);
72
+
73
+ // const calculateVisibleItems = useCallback(() => {
74
+ // const container = containerRef.current;
75
+ // if (!container) return visibleCount;
76
+
77
+ // const children = Array.from(container.children) as HTMLElement[];
78
+
79
+ // let availableWidth = container.offsetWidth;
80
+ // let usedWidth = 0;
81
+ // let fitCount = 0;
82
+
83
+ // for (const child of children) {
84
+ // const childWidth = child.offsetWidth + 4; // gap/margin
85
+ // if (usedWidth + childWidth <= availableWidth) {
86
+ // usedWidth += childWidth;
87
+ // fitCount++;
88
+ // } else {
89
+ // break;
90
+ // }
91
+ // }
92
+
93
+ // return fitCount;
94
+ // }, []); // No dependencies
95
+
96
+ // useEffect(() => {
97
+ // const container = containerRef.current;
98
+ // if (!container) return;
99
+
100
+ // let animationFrameId: number | null = null;
101
+
102
+ // const resizeObserver = new ResizeObserver(() => {
103
+ // if (animationFrameId) cancelAnimationFrame(animationFrameId);
104
+ // animationFrameId = requestAnimationFrame(() => {
105
+ // const newVisibleCount = calculateVisibleItems();
106
+ // setVisibleCount((prevVisibleCount: number) => {
107
+
108
+ // if (prevVisibleCount !== newVisibleCount) {
109
+ // return newVisibleCount;
110
+ // }
111
+ // return prevVisibleCount;
112
+ // });
113
+ // });
114
+ // });
115
+
116
+ // resizeObserver.observe(container);
117
+
118
+ // // Initial calculation
119
+ // setVisibleCount(calculateVisibleItems());
120
+
121
+ // // Cleanup
122
+ // return () => {
123
+ // if (animationFrameId) cancelAnimationFrame(animationFrameId);
124
+ // resizeObserver.disconnect();
125
+ // };
126
+ // }, [calculateVisibleItems]); // Only depend on calculateVisibleItems
127
+
128
+ // // Toggle select/unselect item
129
+ // const toggleItem = (value: string) => {
130
+ // let updatedItems;
131
+ // if (selectedItems.includes(value)) {
132
+ // updatedItems = selectedItems.filter((v: string) => v !== value);
133
+ // } else {
134
+ // updatedItems = [...selectedItems, value];
135
+ // }
136
+ // field.onChange(updatedItems);
137
+ // onSelect && onSelect(updatedItems);
138
+ // };
139
+
140
+ // const onWheel = (e: React.WheelEvent<HTMLDivElement>) => {
141
+ // const el = e.currentTarget;
142
+ // el.scrollTop += e.deltaY; // manually scroll
143
+ // e.preventDefault(); // prevent parent scroll
144
+ // };
145
+
146
+ // return (
147
+ // <FormItem>
148
+ // {label && <FormLabel>{label}</FormLabel>}
149
+
150
+ // <Popover>
151
+ // <PopoverTrigger asChild className="w-full">
152
+ // <FormControl>
153
+ // <Button
154
+ // variant="outline"
155
+ // role="combobox"
156
+ // className={cn(
157
+ // "justify-between",
158
+ // !selectedItems.length && "text-foreground/50"
159
+ // )}
160
+ // disabled={
161
+ // disabled === true || (disabled && disabled(...arguments))
162
+ // }
163
+ // >
164
+ // {selectedItems.length > 0 ? (
165
+ // <TooltipProvider>
166
+ // <div ref={containerRef} className="flex flex-wrap gap-2 items-center overflow-hidden">
167
+ // {selectedItems.slice(0, defaultOptions).map((value: string) => {
168
+ // const label = items.find((item) => item.value === value)?.label || value;
169
+ // return (
170
+ // <span
171
+ // key={value}
172
+ // className="flex items-center px-2 py-1 bg-secondary text-secondary-foreground rounded-md truncate max-w-full"
173
+ // title={label}
174
+ // >
175
+ // <span className="truncate max-w-[120px]">{label}</span>
176
+ // <span
177
+ // role="button"
178
+ // tabIndex={0}
179
+ // onClick={(e) => {
180
+ // e.stopPropagation(); // prevent popover toggle
181
+ // const updated = selectedItems.filter((v: string) => v !== value);
182
+ // field.onChange(updated);
183
+ // onSelect && onSelect(updated);
184
+ // }}
185
+ // onKeyDown={(e) => {
186
+ // if (e.key === 'Enter' || e.key === ' ') {
187
+ // e.preventDefault();
188
+ // e.stopPropagation();
189
+ // const updated = selectedItems.filter((v: string) => v !== value);
190
+ // field.onChange(updated);
191
+ // onSelect && onSelect(updated);
192
+ // }
193
+ // }}
194
+ // className="ml-1 text-muted-foreground hover:text-destructive cursor-pointer outline-none"
195
+ // >
196
+ // <X className="w-3 h-3 ml-1" />
197
+ // </span>
198
+ // </span>
199
+ // );
200
+ // })}
201
+
202
+ // {selectedItems.length > defaultOptions && (
203
+ // <Tooltip>
204
+ // <TooltipTrigger asChild>
205
+ // <span className="px-2 py-1 bg-secondary text-secondary-foreground rounded-md cursor-pointer">
206
+ // +{selectedItems.length - defaultOptions} more
207
+ // </span>
208
+ // </TooltipTrigger>
209
+ // <TooltipContent className="max-w-xs break-words">
210
+ // <div
211
+ // onWheel={onWheel}
212
+ // className="flex flex-col gap-1 max-h-[200px] overflow-auto"
213
+ // >
214
+ // {selectedItems.slice(defaultOptions).map((value: string) => (
215
+ // <span key={value} className="text-sm">
216
+ // {items.find((item) => item.value === value)?.label || value}
217
+ // </span>
218
+ // ))}
219
+ // </div>
220
+ // </TooltipContent>
221
+ // </Tooltip>
222
+ // )}
223
+ // </div>
224
+ // </TooltipProvider>
225
+ // ) : (
226
+ // placeholder
227
+ // )}
228
+ // <ChevronsUpDown className="opacity-50" />
229
+ // </Button>
230
+ // </FormControl>
231
+ // </PopoverTrigger>
232
+
233
+ // <PopoverContent id="multiSelectPopover" className="p-0 w-full max-w-[300px]" align="start">
234
+ // <Command id="commandPopover">
235
+ // <CommandInput
236
+ // placeholder="Search..."
237
+ // value={search}
238
+ // onValueChange={setSearch}
239
+ // autoFocus
240
+ // />
241
+ // <CommandList
242
+ // className="max-h-60 overflow-auto"
243
+ // onWheel={onWheel}
244
+ // >
245
+ // <CommandEmpty>No items found.</CommandEmpty>
246
+ // <CommandGroup>
247
+ // {filteredItems.map((item) => {
248
+ // const isSelected = selectedItems.includes(item.value);
249
+ // return (
250
+ // <CommandItem
251
+ // value={item.label ?? ""}
252
+ // key={item.value}
253
+ // onSelect={() => toggleItem(item.value)}
254
+ // >
255
+ // {item.label}
256
+ // <Check
257
+ // className={cn(
258
+ // "ml-auto",
259
+ // isSelected ? "opacity-100" : "opacity-0"
260
+ // )}
261
+ // />
262
+ // </CommandItem>
263
+ // );
264
+ // })}
265
+ // </CommandGroup>
266
+ // </CommandList>
267
+ // </Command>
268
+ // </PopoverContent>
269
+ // </Popover>
270
+
271
+ // {formDescription && (
272
+ // <FormDescription>{formDescription}</FormDescription>
273
+ // )}
274
+ // <FormMessage />
275
+ // </FormItem>
276
+ // );
277
+ // }}
278
+ // />
279
+ // );
280
+ // }
281
+
282
+
283
+ import {
284
+ FormControl,
285
+ FormDescription,
286
+ FormField,
287
+ FormItem,
288
+ FormLabel,
289
+ FormMessage,
290
+ } from "../../../ikonShade/form";
291
+ import React, { useState, useEffect, useRef, useCallback } from "react";
292
+ import { Popover, PopoverContent, PopoverTrigger } from "../../../ikonShade/popover";
293
+ import { Button } from "../../../ikonShade/button";
294
+ import { cn } from "../../../utils/cn";
295
+ import { ChevronsUpDown, X } from "lucide-react";
296
+ import {
297
+ Command,
298
+ CommandEmpty,
299
+ CommandGroup,
300
+ CommandInput,
301
+ CommandItem,
302
+ CommandList,
303
+ } from "../../../ikonShade/command";
304
+ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "../../../ikonShade/tooltip";
305
+ import { FormComboboxInputProps as BaseFormComboboxInputProps } from "../../form-fields/types";
306
+ import { Checkbox } from "../../../ikonShade/checkbox";
307
+
308
+ interface FormComboboxInputProps extends BaseFormComboboxInputProps {
309
+ defaultOptions?: number;
310
+ }
311
+
312
+ export function FormMultiComboboxInput({
313
+ formControl,
314
+ name,
315
+ label,
316
+ placeholder,
317
+ formDescription,
318
+ items = [],
319
+ disabled,
320
+ onSelect,
321
+ defaultValue = [],
322
+ defaultOptions = 2,
323
+ }: FormComboboxInputProps) {
324
+ const [search, setSearch] = useState("");
325
+ const containerRef = useRef<HTMLDivElement>(null);
326
+ // Removed triggerRef and popoverWidth state, as we'll rely on CSS variables for sizing
327
+
328
+ // Filter items based on search
329
+ const filteredItems = items
330
+ .filter((item) => item.label?.toLowerCase().includes(search.toLowerCase()))
331
+ .sort((a, b) => (a?.label ?? "").localeCompare(b?.label ?? ""));
332
+
333
+
334
+ return (
335
+ <FormField
336
+ control={formControl}
337
+ name={name}
338
+ render={({ field }) => {
339
+ useEffect(() => {
340
+ if (
341
+ (field.value === undefined || field.value === null) &&
342
+ defaultValue.length > 0
343
+ ) {
344
+ field.onChange(defaultValue);
345
+ }
346
+ }, [defaultValue, field]);
347
+
348
+ const selectedItems = field.value || [];
349
+ const [visibleCount, setVisibleCount] = useState(selectedItems.length);
350
+
351
+ const calculateVisibleItems = useCallback(() => {
352
+ const container = containerRef.current;
353
+ if (!container) return visibleCount;
354
+
355
+ const children = Array.from(container.children) as HTMLElement[];
356
+
357
+ let availableWidth = container.offsetWidth;
358
+ let usedWidth = 0;
359
+ let fitCount = 0;
360
+
361
+ for (const child of children) {
362
+ const childWidth = child.offsetWidth + 4; // gap/margin
363
+ if (usedWidth + childWidth <= availableWidth) {
364
+ usedWidth += childWidth;
365
+ fitCount++;
366
+ } else {
367
+ break;
368
+ }
369
+ }
370
+
371
+ return fitCount;
372
+ }, [visibleCount]);
373
+
374
+ useEffect(() => {
375
+ const container = containerRef.current;
376
+ if (!container) return;
377
+
378
+ let animationFrameId: number | null = null;
379
+
380
+ const resizeObserver = new ResizeObserver(() => {
381
+ if (animationFrameId) cancelAnimationFrame(animationFrameId);
382
+ animationFrameId = requestAnimationFrame(() => {
383
+ const newVisibleCount = calculateVisibleItems();
384
+ setVisibleCount((prevVisibleCount: number) => {
385
+ if (prevVisibleCount !== newVisibleCount) {
386
+ return newVisibleCount;
387
+ }
388
+ return prevVisibleCount;
389
+ });
390
+ });
391
+ });
392
+
393
+ resizeObserver.observe(container);
394
+
395
+ setVisibleCount(calculateVisibleItems());
396
+
397
+ return () => {
398
+ if (animationFrameId) cancelAnimationFrame(animationFrameId);
399
+ resizeObserver.disconnect();
400
+ };
401
+ }, [calculateVisibleItems]);
402
+
403
+ const toggleItem = (value: string) => {
404
+ let updatedItems;
405
+ if (selectedItems.includes(value)) {
406
+ updatedItems = selectedItems.filter((v: string) => v !== value);
407
+ } else {
408
+ updatedItems = [...selectedItems, value];
409
+ }
410
+ field.onChange(updatedItems);
411
+ onSelect && onSelect(updatedItems);
412
+ };
413
+
414
+ const onWheel = (e: React.WheelEvent<HTMLDivElement>) => {
415
+ const el = e.currentTarget;
416
+ el.scrollTop += e.deltaY;
417
+ e.preventDefault();
418
+ };
419
+
420
+ return (
421
+ <FormItem>
422
+ {label && <FormLabel>{label}</FormLabel>}
423
+
424
+ <Popover>
425
+ <PopoverTrigger asChild className="w-full">
426
+ <FormControl>
427
+ <Button
428
+ // Removed ref={triggerRef} here as it's no longer needed for explicit width measurement
429
+ variant="outline"
430
+ role="combobox"
431
+ className={cn(
432
+ "justify-between",
433
+ !selectedItems.length && "text-foreground/50"
434
+ )}
435
+ disabled={
436
+ disabled === true || (disabled && disabled(...arguments))
437
+ }
438
+ >
439
+ {selectedItems.length > 0 ? (
440
+ <TooltipProvider>
441
+ <div
442
+ ref={containerRef}
443
+ className="flex flex-wrap gap-2 items-center overflow-hidden"
444
+ >
445
+ {selectedItems.slice(0, defaultOptions).map((value: string) => {
446
+ const label =
447
+ items.find((item) => item.value === value)?.label ||
448
+ value;
449
+ return (
450
+ <span
451
+ key={value}
452
+ className="flex items-center px-2 py-1 bg-secondary text-secondary-foreground rounded-md truncate max-w-full"
453
+ title={label}
454
+ >
455
+ <span className="truncate max-w-[120px]">{label}</span>
456
+ <span
457
+ role="button"
458
+ tabIndex={0}
459
+ onClick={(e) => {
460
+ e.stopPropagation();
461
+ const updated = selectedItems.filter(
462
+ (v: string) => v !== value
463
+ );
464
+ field.onChange(updated);
465
+ onSelect && onSelect(updated);
466
+ }}
467
+ onKeyDown={(e) => {
468
+ if (e.key === "Enter" || e.key === " ") {
469
+ e.preventDefault();
470
+ e.stopPropagation();
471
+ const updated = selectedItems.filter(
472
+ (v: string) => v !== value
473
+ );
474
+ field.onChange(updated);
475
+ onSelect && onSelect(updated);
476
+ }
477
+ }}
478
+ className="ml-1 text-muted-foreground hover:text-destructive cursor-pointer outline-none"
479
+ >
480
+ <X className="w-3 h-3 ml-1" />
481
+ </span>
482
+ </span>
483
+ );
484
+ })}
485
+
486
+ {selectedItems.length > defaultOptions && (
487
+ <Tooltip>
488
+ <TooltipTrigger asChild>
489
+ <span className="px-2 py-1 bg-secondary text-secondary-foreground rounded-md cursor-pointer">
490
+ +{selectedItems.length - defaultOptions} more
491
+ </span>
492
+ </TooltipTrigger>
493
+ <TooltipContent className="max-w-xs break-words">
494
+ <div
495
+ onWheel={onWheel}
496
+ className="flex flex-col gap-1 max-h-[200px] overflow-auto"
497
+ >
498
+ {selectedItems.slice(defaultOptions).map((value: string) => (
499
+ <span key={value} className="text-sm">
500
+ {items.find((item) => item.value === value)
501
+ ?.label || value}
502
+ </span>
503
+ ))}
504
+ </div>
505
+ </TooltipContent>
506
+ </Tooltip>
507
+ )}
508
+ </div>
509
+ </TooltipProvider>
510
+ ) : (
511
+ placeholder
512
+ )}
513
+ <ChevronsUpDown className="opacity-50" />
514
+ </Button>
515
+ </FormControl>
516
+ </PopoverTrigger>
517
+
518
+ <PopoverContent
519
+ id="multiSelectPopover"
520
+ // New and improved width logic for PopoverContent
521
+ className="p-0 min-w-[--radix-popover-trigger-width]" // Ensures at least trigger width
522
+ style={{
523
+ width: 'max-content', // Allow to grow with content
524
+ maxWidth: 'min(500px, 90vw)' // Cap at 500px or 90% of viewport width, whichever is smaller
525
+ }}
526
+ align="start"
527
+ >
528
+ <Command id="commandPopover">
529
+ <CommandInput
530
+ placeholder="Search..."
531
+ value={search}
532
+ onValueChange={setSearch}
533
+ autoFocus
534
+ />
535
+ <CommandList
536
+ className="max-h-60 overflow-auto"
537
+ onWheel={onWheel}
538
+ >
539
+ <CommandEmpty>No items found.</CommandEmpty>
540
+ <CommandGroup>
541
+ {filteredItems.map((item) => {
542
+ const isSelected = selectedItems.includes(item.value);
543
+ return (
544
+ <CommandItem
545
+ value={item.label ?? ""}
546
+ key={item.value}
547
+ onSelect={() => toggleItem(item.value)}
548
+ className="flex items-center space-x-2 justify-start"
549
+ >
550
+ <Checkbox
551
+ checked={isSelected}
552
+ onCheckedChange={() => toggleItem(item.value)}
553
+ onClick={(e) => e.stopPropagation()}
554
+ />
555
+ <span>{item.label}</span>
556
+ </CommandItem>
557
+ );
558
+ })}
559
+ </CommandGroup>
560
+ </CommandList>
561
+ </Command>
562
+ </PopoverContent>
563
+ </Popover>
564
+
565
+ {formDescription && (
566
+ <FormDescription>{formDescription}</FormDescription>
567
+ )}
568
+ <FormMessage />
569
+ </FormItem>
570
+ );
571
+ }}
572
+ />
573
+ );
574
+ }