@carlonicora/nextjs-jsonapi 1.0.3 → 1.0.5

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 (515) hide show
  1. package/dist/{AbstractService-BKlpJA61.d.mts → AbstractService-B2n_JdiC.d.mts} +1 -1
  2. package/dist/{AbstractService-D9eSVKNa.d.ts → AbstractService-DtQTYovo.d.ts} +1 -1
  3. package/dist/{content.interface-Dg2lt_An.d.mts → AuthComponent-CPLvEerw.d.mts} +11 -15
  4. package/dist/{content.interface-BhyAiOFq.d.ts → AuthComponent-m6Qp4Hz6.d.ts} +11 -15
  5. package/dist/{BlockNoteEditor-UVO3VZZE.mjs → BlockNoteEditor-BLVXQPXV.mjs} +14 -18
  6. package/dist/{BlockNoteEditor-UVO3VZZE.mjs.map → BlockNoteEditor-BLVXQPXV.mjs.map} +1 -1
  7. package/dist/{BlockNoteEditor-VFWG6LXI.js → BlockNoteEditor-ZTDHULFT.js} +15 -19
  8. package/dist/BlockNoteEditor-ZTDHULFT.js.map +1 -0
  9. package/dist/JsonApiRequest-O7BGUMFO.mjs +23 -0
  10. package/dist/JsonApiRequest-VARLNKAF.js +23 -0
  11. package/dist/JsonApiRequest-VARLNKAF.js.map +1 -0
  12. package/dist/chunk-2LM6LCJW.mjs +1 -0
  13. package/dist/chunk-3APORDYP.mjs +7783 -0
  14. package/dist/chunk-3APORDYP.mjs.map +1 -0
  15. package/dist/{chunk-TMVHSY3Y.js → chunk-5ZEADNNP.js} +36 -17
  16. package/dist/chunk-5ZEADNNP.js.map +1 -0
  17. package/dist/{chunk-ECDTZBYO.mjs → chunk-74F6BBHH.mjs} +21 -2
  18. package/dist/chunk-74F6BBHH.mjs.map +1 -0
  19. package/dist/{chunk-GYWPEPOH.mjs → chunk-7C5RAEBO.mjs} +72 -68
  20. package/dist/chunk-7C5RAEBO.mjs.map +1 -0
  21. package/dist/chunk-A5DDIABK.js +1 -0
  22. package/dist/{chunk-TEGF6ZWG.js → chunk-AGAJMJ4T.js} +47 -9
  23. package/dist/chunk-AGAJMJ4T.js.map +1 -0
  24. package/dist/{chunk-CXQOWQSY.js → chunk-AYHKQWHH.js} +15 -2
  25. package/dist/chunk-AYHKQWHH.js.map +1 -0
  26. package/dist/{chunk-I2REI7OA.js → chunk-HMHGLXWC.js} +33 -15
  27. package/dist/chunk-HMHGLXWC.js.map +1 -0
  28. package/dist/chunk-IWFGEPAA.mjs +1 -0
  29. package/dist/chunk-JC3WJK65.js +1 -0
  30. package/dist/{chunk-L6EQEAXU.mjs → chunk-PYF2U6WG.mjs} +25 -7
  31. package/dist/chunk-PYF2U6WG.mjs.map +1 -0
  32. package/dist/{chunk-YDVTFM7X.mjs → chunk-RBIVEH2K.mjs} +42 -4
  33. package/dist/chunk-RBIVEH2K.mjs.map +1 -0
  34. package/dist/{chunk-V2JJPI7N.js → chunk-RZO2LOW4.js} +237 -233
  35. package/dist/chunk-RZO2LOW4.js.map +1 -0
  36. package/dist/{chunk-X4BIHJ2B.mjs → chunk-SM63SZCP.mjs} +15 -2
  37. package/dist/chunk-SM63SZCP.mjs.map +1 -0
  38. package/dist/chunk-WEC4YMOS.js +7783 -0
  39. package/dist/chunk-WEC4YMOS.js.map +1 -0
  40. package/dist/client/index.d.mts +21 -2
  41. package/dist/client/index.d.ts +21 -2
  42. package/dist/client/index.js +18 -245
  43. package/dist/client/index.js.map +1 -1
  44. package/dist/client/index.mjs +28 -255
  45. package/dist/client/index.mjs.map +1 -1
  46. package/dist/components/index.d.mts +293 -8
  47. package/dist/components/index.d.ts +293 -8
  48. package/dist/components/index.js +78 -2323
  49. package/dist/components/index.js.map +1 -1
  50. package/dist/components/index.mjs +172 -2417
  51. package/dist/components/index.mjs.map +1 -1
  52. package/dist/{config-hXufftVS.d.ts → config-BmnK65TD.d.mts} +1 -0
  53. package/dist/{config-hXufftVS.d.mts → config-BmnK65TD.d.ts} +1 -0
  54. package/dist/config-DQeAo9Kf.d.mts +49 -0
  55. package/dist/config-DQeAo9Kf.d.ts +49 -0
  56. package/dist/contexts/index.d.mts +109 -21
  57. package/dist/contexts/index.d.ts +109 -21
  58. package/dist/contexts/index.js +39 -7
  59. package/dist/contexts/index.js.map +1 -1
  60. package/dist/contexts/index.mjs +40 -8
  61. package/dist/core/index.d.mts +3 -4
  62. package/dist/core/index.d.ts +3 -4
  63. package/dist/core/index.js +3 -7
  64. package/dist/core/index.js.map +1 -1
  65. package/dist/core/index.mjs +4 -8
  66. package/dist/{d3.link.interface-QMdB22bC.d.mts → d3.link.interface-ClC4Irqp.d.mts} +2 -1
  67. package/dist/{d3.link.interface-QMdB22bC.d.ts → d3.link.interface-ClC4Irqp.d.ts} +2 -1
  68. package/dist/features/index.d.mts +17 -86
  69. package/dist/features/index.d.ts +17 -86
  70. package/dist/features/index.js +7 -16
  71. package/dist/features/index.js.map +1 -1
  72. package/dist/features/index.mjs +10 -19
  73. package/dist/hooks/index.d.mts +18 -43
  74. package/dist/hooks/index.d.ts +18 -43
  75. package/dist/hooks/index.js +20 -7
  76. package/dist/hooks/index.js.map +1 -1
  77. package/dist/hooks/index.mjs +19 -6
  78. package/dist/index.d.mts +10 -6
  79. package/dist/index.d.ts +10 -6
  80. package/dist/index.js +13 -10
  81. package/dist/index.js.map +1 -1
  82. package/dist/index.mjs +22 -19
  83. package/dist/interfaces/index.d.mts +2 -1
  84. package/dist/interfaces/index.d.ts +2 -1
  85. package/dist/notification.interface-BBgMUdLR.d.mts +14 -0
  86. package/dist/notification.interface-gyvT-Z2F.d.ts +14 -0
  87. package/dist/permissions/index.d.mts +2 -3
  88. package/dist/permissions/index.d.ts +2 -3
  89. package/dist/server/index.d.mts +38 -18
  90. package/dist/server/index.d.ts +38 -18
  91. package/dist/server/index.js +70 -2
  92. package/dist/server/index.js.map +1 -1
  93. package/dist/server/index.mjs +68 -0
  94. package/dist/server/index.mjs.map +1 -1
  95. package/dist/types-BUAlgqqh.d.ts +39 -0
  96. package/dist/{types-DluCaP1I.d.ts → types-Bl61ob-7.d.mts} +19 -2
  97. package/dist/{types-lQVA8d_P.d.mts → types-Bl61ob-7.d.ts} +19 -2
  98. package/dist/types-iVdVY7ba.d.mts +39 -0
  99. package/dist/useSocket-Cn7fB_B1.d.mts +25 -0
  100. package/dist/useSocket-DzMKRKCA.d.ts +25 -0
  101. package/dist/user.fields-CbdObSmS.d.mts +18 -0
  102. package/dist/user.fields-CbdObSmS.d.ts +18 -0
  103. package/dist/utils/index.d.mts +1 -2
  104. package/dist/utils/index.d.ts +1 -2
  105. package/package.json +6 -3
  106. package/src/atoms/index.ts +1 -0
  107. package/src/atoms/recentPagesAtom.ts +10 -0
  108. package/src/client/context/JsonApiContext.ts +61 -0
  109. package/src/client/context/JsonApiProvider.tsx +27 -0
  110. package/src/client/context/index.ts +2 -0
  111. package/src/client/hooks/index.ts +3 -0
  112. package/src/client/hooks/useJsonApiGet.ts +188 -0
  113. package/src/client/hooks/useJsonApiMutation.ts +193 -0
  114. package/src/client/hooks/useRehydration.ts +47 -0
  115. package/src/client/index.ts +24 -0
  116. package/src/client/request.ts +97 -0
  117. package/src/client/token.ts +10 -0
  118. package/src/components/containers/PageContainer.tsx +15 -0
  119. package/src/components/containers/ReactMarkdownContainer.tsx +119 -0
  120. package/src/components/containers/TabsContainer.tsx +93 -0
  121. package/src/components/containers/index.ts +3 -0
  122. package/src/components/contents/AttributeElement.tsx +20 -0
  123. package/src/components/contents/index.ts +1 -0
  124. package/src/components/details/AllowedUsersDetails.tsx +23 -0
  125. package/src/components/details/index.ts +1 -0
  126. package/src/components/editors/BlockNoteDiffInlineContent.tsx +152 -0
  127. package/src/components/editors/BlockNoteEditor.tsx +404 -0
  128. package/src/components/editors/BlockNoteEditorContainer.tsx +13 -0
  129. package/src/components/editors/BlockNoteEditorFormattingToolbar.tsx +38 -0
  130. package/src/components/editors/index.ts +1 -0
  131. package/src/components/errors/ErrorDetails.tsx +41 -0
  132. package/src/components/errors/errorToast.ts +9 -0
  133. package/src/components/errors/index.ts +2 -0
  134. package/src/components/forms/CommonAssociationForm.tsx +162 -0
  135. package/src/components/forms/CommonDeleter.tsx +94 -0
  136. package/src/components/forms/CommonEditorButtons.tsx +30 -0
  137. package/src/components/forms/CommonEditorHeader.tsx +35 -0
  138. package/src/components/forms/CommonEditorTrigger.tsx +26 -0
  139. package/src/components/forms/DatePickerPopover.tsx +219 -0
  140. package/src/components/forms/DateRangeSelector.tsx +110 -0
  141. package/src/components/forms/FileUploader.tsx +324 -0
  142. package/src/components/forms/FormCheckbox.tsx +66 -0
  143. package/src/components/forms/FormContainerGeneric.tsx +39 -0
  144. package/src/components/forms/FormDate.tsx +247 -0
  145. package/src/components/forms/FormDateTime.tsx +231 -0
  146. package/src/components/forms/FormInput.tsx +110 -0
  147. package/src/components/forms/FormPassword.tsx +54 -0
  148. package/src/components/forms/FormPlaceAutocomplete.tsx +286 -0
  149. package/src/components/forms/FormSelect.tsx +72 -0
  150. package/src/components/forms/FormSlider.tsx +51 -0
  151. package/src/components/forms/FormSwitch.tsx +25 -0
  152. package/src/components/forms/FormTextarea.tsx +44 -0
  153. package/src/components/forms/MultiFileUploader.tsx +107 -0
  154. package/src/components/forms/PasswordInput.tsx +47 -0
  155. package/src/components/forms/index.ts +22 -0
  156. package/src/components/index.ts +16 -0
  157. package/src/components/navigations/Breadcrumb.tsx +83 -0
  158. package/src/components/navigations/ContentTitle.tsx +39 -0
  159. package/src/components/navigations/Header.tsx +27 -0
  160. package/src/components/navigations/ModeToggleSwitch.tsx +25 -0
  161. package/src/components/navigations/PageSection.tsx +64 -0
  162. package/src/components/navigations/RecentPagesNavigator.tsx +52 -0
  163. package/src/components/navigations/index.ts +6 -0
  164. package/src/components/pages/PageContainerContentDetails.tsx +76 -0
  165. package/src/components/pages/PageContentContainer.tsx +31 -0
  166. package/src/components/pages/index.ts +2 -0
  167. package/src/components/tables/ContentListTable.tsx +166 -0
  168. package/src/components/tables/ContentTableSearch.tsx +105 -0
  169. package/src/components/tables/cells/cell.component.tsx +18 -0
  170. package/src/components/tables/cells/cell.date.tsx +16 -0
  171. package/src/components/tables/cells/cell.id.tsx +27 -0
  172. package/src/components/tables/cells/cell.link.tsx +18 -0
  173. package/src/components/tables/cells/cell.text.tsx +12 -0
  174. package/src/components/tables/cells/cell.url.tsx +13 -0
  175. package/src/components/tables/cells/index.ts +5 -0
  176. package/src/components/tables/index.ts +3 -0
  177. package/src/contexts/CommonContext.tsx +52 -0
  178. package/src/contexts/SharedContext.tsx +37 -0
  179. package/src/contexts/SocketContext.tsx +65 -0
  180. package/src/contexts/index.ts +7 -0
  181. package/src/core/abstracts/AbstractApiData.ts +138 -0
  182. package/src/core/abstracts/AbstractService.ts +263 -0
  183. package/src/core/abstracts/index.ts +2 -0
  184. package/src/core/endpoint/EndpointCreator.ts +97 -0
  185. package/src/core/endpoint/index.ts +1 -0
  186. package/src/core/factories/JsonApiDataFactory.ts +12 -0
  187. package/src/core/factories/RehydrationFactory.ts +30 -0
  188. package/src/core/factories/index.ts +2 -0
  189. package/src/core/fields/FieldSelector.ts +15 -0
  190. package/src/core/fields/index.ts +1 -0
  191. package/src/core/index.ts +20 -0
  192. package/src/core/interfaces/ApiData.ts +8 -0
  193. package/src/core/interfaces/ApiDataInterface.ts +15 -0
  194. package/src/core/interfaces/ApiRequestDataTypeInterface.ts +14 -0
  195. package/src/core/interfaces/ApiResponseInterface.ts +17 -0
  196. package/src/core/interfaces/JsonApiHydratedDataInterface.ts +5 -0
  197. package/src/core/interfaces/index.ts +5 -0
  198. package/{dist/chunk-DO2HLAZO.js → src/core/registry/DataClassRegistry.ts} +20 -17
  199. package/src/core/registry/ModuleRegistrar.ts +43 -0
  200. package/src/core/registry/ModuleRegistry.ts +64 -0
  201. package/src/core/registry/index.ts +3 -0
  202. package/src/core/utils/index.ts +2 -0
  203. package/src/core/utils/rehydrate.ts +24 -0
  204. package/src/core/utils/translateResponse.ts +125 -0
  205. package/src/features/auth/auth.module.ts +9 -0
  206. package/src/features/auth/components/containers/AuthContainer.tsx +32 -0
  207. package/src/features/auth/components/containers/index.ts +1 -0
  208. package/src/features/auth/components/details/LandingComponent.tsx +39 -0
  209. package/src/features/auth/components/details/index.ts +1 -0
  210. package/src/features/auth/components/forms/AcceptInvitation.tsx +136 -0
  211. package/src/features/auth/components/forms/ActivateAccount.tsx +75 -0
  212. package/src/features/auth/components/forms/Cookies.tsx +32 -0
  213. package/src/features/auth/components/forms/ForgotPassword.tsx +108 -0
  214. package/src/features/auth/components/forms/Login.tsx +118 -0
  215. package/src/features/auth/components/forms/Logout.tsx +19 -0
  216. package/src/features/auth/components/forms/RefreshUser.tsx +39 -0
  217. package/src/features/auth/components/forms/Register.tsx +150 -0
  218. package/src/features/auth/components/forms/ResetPassword.tsx +126 -0
  219. package/src/features/auth/components/forms/index.ts +9 -0
  220. package/src/features/auth/components/index.ts +3 -0
  221. package/src/features/auth/config.ts +57 -0
  222. package/src/features/auth/contexts/AuthContext.tsx +77 -0
  223. package/src/features/auth/contexts/index.ts +1 -0
  224. package/src/features/auth/data/auth.interface.ts +31 -0
  225. package/src/features/auth/data/auth.service.ts +159 -0
  226. package/src/features/auth/data/auth.ts +54 -0
  227. package/src/features/auth/data/index.ts +3 -0
  228. package/src/features/auth/enums/AuthComponent.ts +9 -0
  229. package/src/features/auth/enums/index.ts +1 -0
  230. package/src/features/auth/index.ts +4 -0
  231. package/src/features/auth/utils/AuthCookies.ts +134 -0
  232. package/src/features/auth/utils/index.ts +1 -0
  233. package/src/features/company/company.module.ts +10 -0
  234. package/src/features/company/components/containers/AdminCompanyContainer.tsx +26 -0
  235. package/src/features/company/components/containers/CompanyContainer.tsx +17 -0
  236. package/src/features/company/components/containers/index.ts +2 -0
  237. package/src/features/company/components/details/CompanyDetails.tsx +26 -0
  238. package/src/features/company/components/details/index.ts +1 -0
  239. package/src/features/company/components/forms/CompanyConfigurationEditor.tsx +151 -0
  240. package/src/features/company/components/forms/CompanyConfigurationSecurityForm.tsx +97 -0
  241. package/src/features/company/components/forms/CompanyDeleter.tsx +121 -0
  242. package/src/features/company/components/forms/CompanyEditor.tsx +245 -0
  243. package/src/features/company/components/forms/CompanyLicense.tsx +213 -0
  244. package/src/features/company/components/forms/index.ts +5 -0
  245. package/src/features/company/components/index.ts +4 -0
  246. package/src/features/company/components/lists/CompaniesList.tsx +31 -0
  247. package/src/features/company/components/lists/index.ts +1 -0
  248. package/src/features/company/contexts/CompanyContext.tsx +99 -0
  249. package/src/features/company/contexts/index.ts +0 -0
  250. package/src/features/company/data/company.fields.ts +6 -0
  251. package/src/features/company/data/company.interface.ts +28 -0
  252. package/src/features/company/data/company.service.ts +73 -0
  253. package/src/features/company/data/company.ts +104 -0
  254. package/src/features/company/data/index.ts +4 -0
  255. package/src/features/company/hooks/index.ts +1 -0
  256. package/src/features/company/hooks/useCompanyTableStructure.tsx +82 -0
  257. package/src/features/company/index.ts +2 -0
  258. package/src/features/content/content.module.ts +20 -0
  259. package/src/features/content/data/content.fields.ts +13 -0
  260. package/src/features/content/data/content.interface.ts +23 -0
  261. package/src/features/content/data/content.service.ts +75 -0
  262. package/src/features/content/data/content.ts +85 -0
  263. package/src/features/content/data/index.ts +4 -0
  264. package/src/features/content/index.ts +2 -0
  265. package/src/features/feature/components/forms/FormFeatures.tsx +150 -0
  266. package/src/features/feature/components/forms/index.ts +1 -0
  267. package/src/features/feature/components/index.ts +1 -0
  268. package/src/features/feature/data/feature.interface.ts +9 -0
  269. package/src/features/feature/data/feature.service.ts +19 -0
  270. package/src/features/feature/data/feature.ts +33 -0
  271. package/src/features/feature/data/index.ts +3 -0
  272. package/src/features/feature/feature.module.ts +10 -0
  273. package/src/features/feature/index.ts +2 -0
  274. package/src/features/index.ts +12 -0
  275. package/src/features/module/data/index.ts +2 -0
  276. package/src/features/module/data/module.interface.ts +12 -0
  277. package/src/features/module/data/module.ts +42 -0
  278. package/src/features/module/index.ts +2 -0
  279. package/src/features/module/module.module.ts +10 -0
  280. package/src/features/notification/components/common/NotificationErrorBoundary.tsx +51 -0
  281. package/src/features/notification/components/common/index.ts +1 -0
  282. package/src/features/notification/components/containers/NotificationsListContainer.tsx +44 -0
  283. package/src/features/notification/components/containers/index.ts +1 -0
  284. package/src/features/notification/components/index.ts +5 -0
  285. package/src/features/notification/components/lists/NotificationsList.tsx +129 -0
  286. package/src/features/notification/components/lists/index.ts +1 -0
  287. package/src/features/notification/components/modals/NotificationModal.tsx +220 -0
  288. package/src/features/notification/components/modals/index.ts +1 -0
  289. package/src/features/notification/components/notifications/Notification.tsx +120 -0
  290. package/src/features/notification/components/notifications/PushNotificationProvider.tsx +9 -0
  291. package/src/features/notification/components/notifications/index.ts +2 -0
  292. package/src/features/notification/contexts/NotificationContext.tsx +187 -0
  293. package/src/features/notification/contexts/index.ts +1 -0
  294. package/src/features/notification/data/index.ts +4 -0
  295. package/src/features/notification/data/notification.fields.ts +8 -0
  296. package/src/features/notification/data/notification.interface.ts +14 -0
  297. package/src/features/notification/data/notification.service.ts +34 -0
  298. package/src/features/notification/data/notification.ts +51 -0
  299. package/src/features/notification/index.ts +2 -0
  300. package/src/features/notification/notification.module.ts +10 -0
  301. package/src/features/push/data/index.ts +3 -0
  302. package/src/features/push/data/push.interface.ts +8 -0
  303. package/src/features/push/data/push.service.ts +17 -0
  304. package/src/features/push/data/push.ts +18 -0
  305. package/src/features/push/index.ts +2 -0
  306. package/src/features/push/push.module.ts +10 -0
  307. package/src/features/role/components/containers/RoleContainer.tsx +18 -0
  308. package/src/features/role/components/containers/index.ts +1 -0
  309. package/src/features/role/components/details/RoleDetails.tsx +21 -0
  310. package/src/features/role/components/details/index.ts +1 -0
  311. package/src/features/role/components/forms/FormRoles.tsx +82 -0
  312. package/src/features/role/components/forms/RemoveUserFromRole.tsx +108 -0
  313. package/src/features/role/components/forms/UserRoleAdd.tsx +128 -0
  314. package/src/features/role/components/forms/index.ts +3 -0
  315. package/src/features/role/components/index.ts +4 -0
  316. package/src/features/role/components/lists/RolesList.tsx +27 -0
  317. package/src/features/role/components/lists/UserRolesList.tsx +31 -0
  318. package/src/features/role/components/lists/index.ts +2 -0
  319. package/src/features/role/contexts/RoleContext.tsx +84 -0
  320. package/src/features/role/contexts/index.ts +1 -0
  321. package/src/features/role/data/index.ts +4 -0
  322. package/src/features/role/data/role.fields.ts +8 -0
  323. package/src/features/role/data/role.interface.ts +16 -0
  324. package/src/features/role/data/role.service.ts +117 -0
  325. package/src/features/role/data/role.ts +62 -0
  326. package/src/features/role/hooks/index.ts +1 -0
  327. package/src/features/role/hooks/useRoleTableStructure.tsx +72 -0
  328. package/src/features/role/index.ts +2 -0
  329. package/src/features/role/role.module.ts +10 -0
  330. package/src/features/s3/data/index.ts +3 -0
  331. package/src/features/s3/data/s3.interface.ts +11 -0
  332. package/src/features/s3/data/s3.service.ts +30 -0
  333. package/src/features/s3/data/s3.ts +60 -0
  334. package/src/features/s3/index.ts +2 -0
  335. package/src/features/s3/s3.module.ts +10 -0
  336. package/src/features/search/index.ts +1 -0
  337. package/src/features/search/interfaces/index.ts +1 -0
  338. package/src/features/search/interfaces/search.result.interface.ts +3 -0
  339. package/src/features/user/author.module.ts +10 -0
  340. package/src/features/user/components/containers/UserContainer.tsx +23 -0
  341. package/src/features/user/components/containers/UserIndexContainer.tsx +12 -0
  342. package/src/features/user/components/containers/UsersListContainer.tsx +36 -0
  343. package/src/features/user/components/containers/index.ts +3 -0
  344. package/src/features/user/components/details/UserDetails.tsx +74 -0
  345. package/src/features/user/components/details/UserIndexDetails.tsx +28 -0
  346. package/src/features/user/components/details/index.ts +2 -0
  347. package/src/features/user/components/forms/RoleUserAdd.tsx +93 -0
  348. package/src/features/user/components/forms/UserAvatarEditor.tsx +78 -0
  349. package/src/features/user/components/forms/UserDeleter.tsx +49 -0
  350. package/src/features/user/components/forms/UserEditor.tsx +319 -0
  351. package/src/features/user/components/forms/UserMultiSelect.tsx +218 -0
  352. package/src/features/user/components/forms/UserReactivator.tsx +79 -0
  353. package/src/features/user/components/forms/UserResentInvitationEmail.tsx +88 -0
  354. package/src/features/user/components/forms/UserSelector.tsx +185 -0
  355. package/src/features/user/components/forms/index.ts +8 -0
  356. package/src/features/user/components/index.ts +5 -0
  357. package/src/features/user/components/lists/AdminUsersList.tsx +41 -0
  358. package/src/features/user/components/lists/CompanyUsersList.tsx +44 -0
  359. package/src/features/user/components/lists/ContributorsList.tsx +41 -0
  360. package/src/features/user/components/lists/RelevantUsersList.tsx +30 -0
  361. package/src/features/user/components/lists/RoleUsersList.tsx +31 -0
  362. package/src/features/user/components/lists/UserListInAdd.tsx +53 -0
  363. package/src/features/user/components/lists/UsersList.tsx +30 -0
  364. package/src/features/user/components/lists/UsersListByContentIds.tsx +30 -0
  365. package/src/features/user/components/lists/index.ts +8 -0
  366. package/src/features/user/components/widgets/UserAvatar.tsx +86 -0
  367. package/src/features/user/components/widgets/UserAvatarList.tsx +31 -0
  368. package/src/features/user/components/widgets/UserSearchPopover.tsx +89 -0
  369. package/src/features/user/components/widgets/index.ts +1 -0
  370. package/src/features/user/contexts/CurrentUserContext.tsx +156 -0
  371. package/src/features/user/contexts/UserContext.tsx +106 -0
  372. package/src/features/user/contexts/index.ts +2 -0
  373. package/src/features/user/data/index.ts +4 -0
  374. package/src/features/user/data/user.fields.ts +8 -0
  375. package/src/features/user/data/user.interface.ts +41 -0
  376. package/src/features/user/data/user.service.ts +246 -0
  377. package/src/features/user/data/user.ts +162 -0
  378. package/src/features/user/hooks/index.ts +2 -0
  379. package/src/features/user/hooks/useUserSearch.ts +53 -0
  380. package/src/features/user/hooks/useUserTableStructure.tsx +115 -0
  381. package/src/features/user/index.ts +3 -0
  382. package/src/features/user/user.module.ts +21 -0
  383. package/src/hooks/TableGeneratorRegistry.ts +53 -0
  384. package/src/hooks/index.ts +37 -0
  385. package/src/hooks/types.ts +35 -0
  386. package/src/hooks/url.rewriter.ts +22 -0
  387. package/src/hooks/useCustomD3Graph.tsx +707 -0
  388. package/src/hooks/useDataListRetriever.ts +349 -0
  389. package/src/hooks/useDebounce.ts +33 -0
  390. package/src/hooks/useNotificationSync.ts +20 -0
  391. package/src/hooks/usePageTracker.ts +69 -0
  392. package/src/hooks/usePageUrlGenerator.ts +50 -0
  393. package/src/hooks/usePushNotifications.ts +82 -0
  394. package/src/hooks/useSocket.ts +201 -0
  395. package/src/hooks/useTableGenerator.ts +20 -0
  396. package/src/i18n/config.ts +74 -0
  397. package/src/i18n/index.ts +18 -0
  398. package/src/index.ts +20 -0
  399. package/src/interfaces/breadcrumb.item.data.interface.ts +4 -0
  400. package/src/interfaces/d3.link.interface.ts +8 -0
  401. package/src/interfaces/d3.node.interface.ts +12 -0
  402. package/src/interfaces/index.ts +3 -0
  403. package/src/permissions/check.ts +127 -0
  404. package/src/permissions/index.ts +2 -0
  405. package/src/permissions/types.ts +109 -0
  406. package/src/roles/config.ts +46 -0
  407. package/src/roles/index.ts +1 -0
  408. package/src/server/ServerSession.ts +103 -0
  409. package/src/server/cache.ts +28 -0
  410. package/src/server/index.ts +4 -0
  411. package/src/server/request.ts +113 -0
  412. package/src/server/token.ts +10 -0
  413. package/src/shadcnui/custom/kanban.tsx +1001 -0
  414. package/src/shadcnui/custom/link.tsx +18 -0
  415. package/src/shadcnui/custom/multi-select.tsx +382 -0
  416. package/src/shadcnui/index.ts +49 -0
  417. package/src/shadcnui/ui/accordion.tsx +52 -0
  418. package/src/shadcnui/ui/alert-dialog.tsx +141 -0
  419. package/src/shadcnui/ui/alert.tsx +43 -0
  420. package/src/shadcnui/ui/avatar.tsx +50 -0
  421. package/src/shadcnui/ui/badge.tsx +40 -0
  422. package/src/shadcnui/ui/breadcrumb.tsx +115 -0
  423. package/src/shadcnui/ui/button.tsx +51 -0
  424. package/src/shadcnui/ui/calendar.tsx +73 -0
  425. package/src/shadcnui/ui/card.tsx +43 -0
  426. package/src/shadcnui/ui/carousel.tsx +225 -0
  427. package/src/shadcnui/ui/chart.tsx +320 -0
  428. package/src/shadcnui/ui/checkbox.tsx +29 -0
  429. package/src/shadcnui/ui/collapsible.tsx +11 -0
  430. package/src/shadcnui/ui/command.tsx +155 -0
  431. package/src/shadcnui/ui/context-menu.tsx +179 -0
  432. package/src/shadcnui/ui/dialog.tsx +96 -0
  433. package/src/shadcnui/ui/drawer.tsx +89 -0
  434. package/src/shadcnui/ui/dropdown-menu.tsx +205 -0
  435. package/src/shadcnui/ui/form.tsx +138 -0
  436. package/src/shadcnui/ui/hover-card.tsx +29 -0
  437. package/src/shadcnui/ui/input.tsx +21 -0
  438. package/src/shadcnui/ui/label.tsx +26 -0
  439. package/src/shadcnui/ui/navigation-menu.tsx +168 -0
  440. package/src/shadcnui/ui/popover.tsx +33 -0
  441. package/src/shadcnui/ui/progress.tsx +25 -0
  442. package/src/shadcnui/ui/radio-group.tsx +37 -0
  443. package/src/shadcnui/ui/resizable.tsx +47 -0
  444. package/src/shadcnui/ui/scroll-area.tsx +40 -0
  445. package/src/shadcnui/ui/select.tsx +164 -0
  446. package/src/shadcnui/ui/separator.tsx +28 -0
  447. package/src/shadcnui/ui/sheet.tsx +139 -0
  448. package/src/shadcnui/ui/sidebar.tsx +677 -0
  449. package/src/shadcnui/ui/skeleton.tsx +13 -0
  450. package/src/shadcnui/ui/slider.tsx +25 -0
  451. package/src/shadcnui/ui/sonner.tsx +25 -0
  452. package/src/shadcnui/ui/switch.tsx +31 -0
  453. package/src/shadcnui/ui/table.tsx +120 -0
  454. package/src/shadcnui/ui/tabs.tsx +55 -0
  455. package/src/shadcnui/ui/textarea.tsx +24 -0
  456. package/src/shadcnui/ui/toggle.tsx +39 -0
  457. package/src/shadcnui/ui/tooltip.tsx +61 -0
  458. package/src/unified/JsonApiRequest.ts +348 -0
  459. package/src/unified/index.ts +1 -0
  460. package/src/utils/blocknote-diff.util.ts +815 -0
  461. package/src/utils/blocknote-word-diff-renderer.util.ts +413 -0
  462. package/src/utils/cn.ts +6 -0
  463. package/src/utils/compose-refs.ts +61 -0
  464. package/src/utils/date-formatter.ts +53 -0
  465. package/src/utils/exists.ts +7 -0
  466. package/src/utils/index.ts +15 -0
  467. package/src/utils/schemas/entity.object.schema.ts +8 -0
  468. package/src/utils/schemas/index.ts +2 -0
  469. package/src/utils/schemas/user.object.schema.ts +9 -0
  470. package/src/utils/table-options.ts +67 -0
  471. package/src/utils/use-mobile.tsx +21 -0
  472. package/dist/ApiRequestDataTypeInterface-CUKFDBx2.d.mts +0 -20
  473. package/dist/ApiRequestDataTypeInterface-CUKFDBx2.d.ts +0 -20
  474. package/dist/BlockNoteEditor-VFWG6LXI.js.map +0 -1
  475. package/dist/JsonApiRequest-S3ICLM7B.mjs +0 -20
  476. package/dist/JsonApiRequest-ZZLSP26T.js +0 -20
  477. package/dist/JsonApiRequest-ZZLSP26T.js.map +0 -1
  478. package/dist/chunk-366S2JCC.mjs +0 -31
  479. package/dist/chunk-366S2JCC.mjs.map +0 -1
  480. package/dist/chunk-5W6AKZE6.mjs +0 -131
  481. package/dist/chunk-5W6AKZE6.mjs.map +0 -1
  482. package/dist/chunk-A3J3AAYM.mjs +0 -97
  483. package/dist/chunk-A3J3AAYM.mjs.map +0 -1
  484. package/dist/chunk-AWONBQQP.js +0 -97
  485. package/dist/chunk-AWONBQQP.js.map +0 -1
  486. package/dist/chunk-CXQOWQSY.js.map +0 -1
  487. package/dist/chunk-DKKMWBP4.mjs +0 -1
  488. package/dist/chunk-DKKMWBP4.mjs.map +0 -1
  489. package/dist/chunk-DO2HLAZO.js.map +0 -1
  490. package/dist/chunk-DZXDB3K2.mjs +0 -17
  491. package/dist/chunk-DZXDB3K2.mjs.map +0 -1
  492. package/dist/chunk-ECDTZBYO.mjs.map +0 -1
  493. package/dist/chunk-FY4SXJGU.js +0 -806
  494. package/dist/chunk-FY4SXJGU.js.map +0 -1
  495. package/dist/chunk-GYWPEPOH.mjs.map +0 -1
  496. package/dist/chunk-H6FMOA6B.js +0 -1
  497. package/dist/chunk-H6FMOA6B.js.map +0 -1
  498. package/dist/chunk-I2REI7OA.js.map +0 -1
  499. package/dist/chunk-J4Q36PMP.js +0 -31
  500. package/dist/chunk-J4Q36PMP.js.map +0 -1
  501. package/dist/chunk-L6EQEAXU.mjs.map +0 -1
  502. package/dist/chunk-MFO27OHB.mjs +0 -48
  503. package/dist/chunk-MFO27OHB.mjs.map +0 -1
  504. package/dist/chunk-RAF7PNLG.js +0 -131
  505. package/dist/chunk-RAF7PNLG.js.map +0 -1
  506. package/dist/chunk-RUR22SVM.js +0 -17
  507. package/dist/chunk-RUR22SVM.js.map +0 -1
  508. package/dist/chunk-TEGF6ZWG.js.map +0 -1
  509. package/dist/chunk-TMVHSY3Y.js.map +0 -1
  510. package/dist/chunk-V2JJPI7N.js.map +0 -1
  511. package/dist/chunk-WWWMJZEF.mjs +0 -806
  512. package/dist/chunk-WWWMJZEF.mjs.map +0 -1
  513. package/dist/chunk-X4BIHJ2B.mjs.map +0 -1
  514. package/dist/chunk-YDVTFM7X.mjs.map +0 -1
  515. /package/dist/{JsonApiRequest-S3ICLM7B.mjs.map → JsonApiRequest-O7BGUMFO.mjs.map} +0 -0
@@ -0,0 +1,1001 @@
1
+ "use client";
2
+
3
+ import {
4
+ type Announcements,
5
+ type CollisionDetection,
6
+ DndContext,
7
+ type DndContextProps,
8
+ type DragCancelEvent,
9
+ type DragEndEvent,
10
+ type DragOverEvent,
11
+ DragOverlay,
12
+ type DragStartEvent,
13
+ type DraggableAttributes,
14
+ type DraggableSyntheticListeners,
15
+ type DropAnimation,
16
+ type DroppableContainer,
17
+ KeyboardCode,
18
+ type KeyboardCoordinateGetter,
19
+ KeyboardSensor,
20
+ MeasuringStrategy,
21
+ MouseSensor,
22
+ TouchSensor,
23
+ type UniqueIdentifier,
24
+ closestCenter,
25
+ closestCorners,
26
+ defaultDropAnimationSideEffects,
27
+ getFirstCollision,
28
+ pointerWithin,
29
+ rectIntersection,
30
+ useSensor,
31
+ useSensors,
32
+ } from "@dnd-kit/core";
33
+ import {
34
+ type AnimateLayoutChanges,
35
+ SortableContext,
36
+ type SortableContextProps,
37
+ arrayMove,
38
+ defaultAnimateLayoutChanges,
39
+ horizontalListSortingStrategy,
40
+ useSortable,
41
+ verticalListSortingStrategy,
42
+ } from "@dnd-kit/sortable";
43
+ import { CSS } from "@dnd-kit/utilities";
44
+ import { Slot } from "@radix-ui/react-slot";
45
+ import * as React from "react";
46
+ import * as ReactDOM from "react-dom";
47
+
48
+ import { useComposedRefs } from "../../utils/compose-refs";
49
+ import { cn } from "../../utils/cn";
50
+
51
+ const directions: string[] = [KeyboardCode.Down, KeyboardCode.Right, KeyboardCode.Up, KeyboardCode.Left];
52
+
53
+ const coordinateGetter: KeyboardCoordinateGetter = (event, { context }) => {
54
+ const { active, droppableRects, droppableContainers, collisionRect } = context;
55
+
56
+ if (directions.includes(event.code)) {
57
+ event.preventDefault();
58
+
59
+ if (!active || !collisionRect) return;
60
+
61
+ const filteredContainers: DroppableContainer[] = [];
62
+
63
+ for (const entry of droppableContainers.getEnabled()) {
64
+ if (!entry || entry?.disabled) return;
65
+
66
+ const rect = droppableRects.get(entry.id);
67
+
68
+ if (!rect) return;
69
+
70
+ const data = entry.data.current;
71
+
72
+ if (data) {
73
+ const { type, children } = data;
74
+
75
+ if (type === "container" && children?.length > 0) {
76
+ if (active.data.current?.type !== "container") {
77
+ return;
78
+ }
79
+ }
80
+ }
81
+
82
+ switch (event.code) {
83
+ case KeyboardCode.Down:
84
+ if (collisionRect.top < rect.top) {
85
+ filteredContainers.push(entry);
86
+ }
87
+ break;
88
+ case KeyboardCode.Up:
89
+ if (collisionRect.top > rect.top) {
90
+ filteredContainers.push(entry);
91
+ }
92
+ break;
93
+ case KeyboardCode.Left:
94
+ if (collisionRect.left >= rect.left + rect.width) {
95
+ filteredContainers.push(entry);
96
+ }
97
+ break;
98
+ case KeyboardCode.Right:
99
+ if (collisionRect.left + collisionRect.width <= rect.left) {
100
+ filteredContainers.push(entry);
101
+ }
102
+ break;
103
+ }
104
+ }
105
+
106
+ const collisions = closestCorners({
107
+ active,
108
+ collisionRect: collisionRect,
109
+ droppableRects,
110
+ droppableContainers: filteredContainers,
111
+ pointerCoordinates: null,
112
+ });
113
+ const closestId = getFirstCollision(collisions, "id");
114
+
115
+ if (closestId != null) {
116
+ const newDroppable = droppableContainers.get(closestId);
117
+ const newNode = newDroppable?.node.current;
118
+ const newRect = newDroppable?.rect.current;
119
+
120
+ if (newNode && newRect) {
121
+ if (newDroppable.id === "placeholder") {
122
+ return {
123
+ x: newRect.left + (newRect.width - collisionRect.width) / 2,
124
+ y: newRect.top + (newRect.height - collisionRect.height) / 2,
125
+ };
126
+ }
127
+
128
+ if (newDroppable.data.current?.type === "container") {
129
+ return {
130
+ x: newRect.left + 20,
131
+ y: newRect.top + 74,
132
+ };
133
+ }
134
+
135
+ return {
136
+ x: newRect.left,
137
+ y: newRect.top,
138
+ };
139
+ }
140
+ }
141
+ }
142
+
143
+ return undefined;
144
+ };
145
+
146
+ const ROOT_NAME = "Kanban";
147
+ const BOARD_NAME = "KanbanBoard";
148
+ const COLUMN_NAME = "KanbanColumn";
149
+ const COLUMN_HANDLE_NAME = "KanbanColumnHandle";
150
+ const ITEM_NAME = "KanbanItem";
151
+ const ITEM_HANDLE_NAME = "KanbanItemHandle";
152
+ const OVERLAY_NAME = "KanbanOverlay";
153
+
154
+ interface KanbanContextValue<T> {
155
+ id: string;
156
+ items: Record<UniqueIdentifier, T[]>;
157
+ modifiers: DndContextProps["modifiers"];
158
+ strategy: SortableContextProps["strategy"];
159
+ orientation: "horizontal" | "vertical";
160
+ activeId: UniqueIdentifier | null;
161
+ setActiveId: (id: UniqueIdentifier | null) => void;
162
+ getItemValue: (item: T) => UniqueIdentifier;
163
+ flatCursor: boolean;
164
+ }
165
+
166
+ const KanbanContext = React.createContext<KanbanContextValue<unknown> | null>(null);
167
+ KanbanContext.displayName = ROOT_NAME;
168
+
169
+ function useKanbanContext(consumerName: string) {
170
+ const context = React.useContext(KanbanContext);
171
+ if (!context) {
172
+ throw new Error(`\`${consumerName}\` must be used within \`${ROOT_NAME}\``);
173
+ }
174
+ return context;
175
+ }
176
+
177
+ interface GetItemValue<T> {
178
+ /**
179
+ * Callback that returns a unique identifier for each kanban item. Required for array of objects.
180
+ * @example getItemValue={(item) => item.id}
181
+ */
182
+ getItemValue: (item: T) => UniqueIdentifier;
183
+ }
184
+
185
+ type KanbanRootProps<T> = Omit<DndContextProps, "collisionDetection"> &
186
+ GetItemValue<T> & {
187
+ value: Record<UniqueIdentifier, T[]>;
188
+ onValueChange?: (columns: Record<UniqueIdentifier, T[]>) => void;
189
+ onMove?: (event: DragEndEvent & { activeIndex: number; overIndex: number }) => void;
190
+ strategy?: SortableContextProps["strategy"];
191
+ orientation?: "horizontal" | "vertical";
192
+ flatCursor?: boolean;
193
+ } & (T extends object ? GetItemValue<T> : Partial<GetItemValue<T>>);
194
+
195
+ function KanbanRoot<T>(props: KanbanRootProps<T>) {
196
+ const {
197
+ value,
198
+ onValueChange,
199
+ modifiers,
200
+ strategy = verticalListSortingStrategy,
201
+ orientation = "horizontal",
202
+ onMove,
203
+ getItemValue: getItemValueProp,
204
+ accessibility,
205
+ flatCursor = false,
206
+ ...kanbanProps
207
+ } = props;
208
+
209
+ const id = React.useId();
210
+ const [activeId, setActiveId] = React.useState<UniqueIdentifier | null>(null);
211
+ const lastOverIdRef = React.useRef<UniqueIdentifier | null>(null);
212
+ const hasMovedRef = React.useRef(false);
213
+ const sensors = useSensors(
214
+ useSensor(MouseSensor),
215
+ useSensor(TouchSensor),
216
+ useSensor(KeyboardSensor, {
217
+ coordinateGetter,
218
+ }),
219
+ );
220
+
221
+ const getItemValue = React.useCallback(
222
+ (item: T): UniqueIdentifier => {
223
+ if (typeof item === "object" && !getItemValueProp) {
224
+ throw new Error("getItemValue is required when using array of objects");
225
+ }
226
+ return getItemValueProp ? getItemValueProp(item) : (item as UniqueIdentifier);
227
+ },
228
+ [getItemValueProp],
229
+ );
230
+
231
+ const getColumn = React.useCallback(
232
+ (id: UniqueIdentifier) => {
233
+ if (id in value) return id;
234
+
235
+ for (const [columnId, items] of Object.entries(value)) {
236
+ if (items.some((item) => getItemValue(item) === id)) {
237
+ return columnId;
238
+ }
239
+ }
240
+
241
+ return null;
242
+ },
243
+ [value, getItemValue],
244
+ );
245
+
246
+ const collisionDetection: CollisionDetection = React.useCallback(
247
+ (args) => {
248
+ if (activeId && activeId in value) {
249
+ return closestCenter({
250
+ ...args,
251
+ droppableContainers: args.droppableContainers.filter((container) => container.id in value),
252
+ });
253
+ }
254
+
255
+ const pointerIntersections = pointerWithin(args);
256
+ const intersections = pointerIntersections.length > 0 ? pointerIntersections : rectIntersection(args);
257
+ let overId = getFirstCollision(intersections, "id");
258
+
259
+ if (!overId) {
260
+ if (hasMovedRef.current) {
261
+ lastOverIdRef.current = activeId;
262
+ }
263
+ return lastOverIdRef.current ? [{ id: lastOverIdRef.current }] : [];
264
+ }
265
+
266
+ if (overId in value) {
267
+ const containerItems = value[overId];
268
+ if (containerItems && containerItems.length > 0) {
269
+ const closestItem = closestCenter({
270
+ ...args,
271
+ droppableContainers: args.droppableContainers.filter(
272
+ (container) =>
273
+ container.id !== overId && containerItems.some((item) => getItemValue(item) === container.id),
274
+ ),
275
+ });
276
+
277
+ if (closestItem.length > 0) {
278
+ overId = closestItem[0]?.id ?? overId;
279
+ }
280
+ }
281
+ }
282
+
283
+ lastOverIdRef.current = overId;
284
+ return [{ id: overId }];
285
+ },
286
+ [activeId, value, getItemValue],
287
+ );
288
+
289
+ const onDragStart = React.useCallback(
290
+ (event: DragStartEvent) => {
291
+ kanbanProps.onDragStart?.(event);
292
+
293
+ if (event.activatorEvent.defaultPrevented) return;
294
+ setActiveId(event.active.id);
295
+ },
296
+ [kanbanProps.onDragStart],
297
+ );
298
+
299
+ const onDragOver = React.useCallback(
300
+ (event: DragOverEvent) => {
301
+ kanbanProps.onDragOver?.(event);
302
+
303
+ if (event.activatorEvent.defaultPrevented) return;
304
+
305
+ const { active, over } = event;
306
+ if (!over) return;
307
+
308
+ const activeColumn = getColumn(active.id);
309
+ const overColumn = getColumn(over.id);
310
+
311
+ if (!activeColumn || !overColumn) return;
312
+
313
+ if (activeColumn === overColumn) {
314
+ const items = value[activeColumn];
315
+ if (!items) return;
316
+
317
+ const activeIndex = items.findIndex((item) => getItemValue(item) === active.id);
318
+ const overIndex = items.findIndex((item) => getItemValue(item) === over.id);
319
+
320
+ if (activeIndex !== overIndex) {
321
+ const newColumns = { ...value };
322
+ newColumns[activeColumn] = arrayMove(items, activeIndex, overIndex);
323
+ onValueChange?.(newColumns);
324
+ }
325
+ } else {
326
+ const activeItems = value[activeColumn];
327
+ const overItems = value[overColumn];
328
+
329
+ if (!activeItems || !overItems) return;
330
+
331
+ const activeIndex = activeItems.findIndex((item) => getItemValue(item) === active.id);
332
+
333
+ if (activeIndex === -1) return;
334
+
335
+ const activeItem = activeItems[activeIndex];
336
+ if (!activeItem) return;
337
+
338
+ const updatedItems = {
339
+ ...value,
340
+ [activeColumn]: activeItems.filter((item) => getItemValue(item) !== active.id),
341
+ [overColumn]: [...overItems, activeItem],
342
+ };
343
+
344
+ onValueChange?.(updatedItems);
345
+ hasMovedRef.current = true;
346
+ }
347
+ },
348
+ [value, getColumn, getItemValue, onValueChange, kanbanProps.onDragOver],
349
+ );
350
+
351
+ const onDragEnd = React.useCallback(
352
+ (event: DragEndEvent) => {
353
+ kanbanProps.onDragEnd?.(event);
354
+
355
+ if (event.activatorEvent.defaultPrevented) return;
356
+
357
+ const { active, over } = event;
358
+
359
+ if (!over) {
360
+ setActiveId(null);
361
+ return;
362
+ }
363
+
364
+ if (active.id in value && over.id in value) {
365
+ const activeIndex = Object.keys(value).indexOf(active.id as string);
366
+ const overIndex = Object.keys(value).indexOf(over.id as string);
367
+
368
+ if (activeIndex !== overIndex) {
369
+ const orderedColumns = Object.keys(value);
370
+ const newOrder = arrayMove(orderedColumns, activeIndex, overIndex);
371
+
372
+ const newColumns: Record<UniqueIdentifier, T[]> = {};
373
+ for (const key of newOrder) {
374
+ const items = value[key];
375
+ if (items) {
376
+ newColumns[key] = items;
377
+ }
378
+ }
379
+
380
+ if (onMove) {
381
+ onMove({ ...event, activeIndex, overIndex });
382
+ } else {
383
+ onValueChange?.(newColumns);
384
+ }
385
+ }
386
+ } else {
387
+ const activeColumn = getColumn(active.id);
388
+ const overColumn = getColumn(over.id);
389
+
390
+ if (!activeColumn || !overColumn) {
391
+ setActiveId(null);
392
+ return;
393
+ }
394
+
395
+ if (activeColumn === overColumn) {
396
+ const items = value[activeColumn];
397
+ if (!items) {
398
+ setActiveId(null);
399
+ return;
400
+ }
401
+
402
+ const activeIndex = items.findIndex((item) => getItemValue(item) === active.id);
403
+ const overIndex = items.findIndex((item) => getItemValue(item) === over.id);
404
+
405
+ if (activeIndex !== overIndex) {
406
+ const newColumns = { ...value };
407
+ newColumns[activeColumn] = arrayMove(items, activeIndex, overIndex);
408
+ if (onMove) {
409
+ onMove({
410
+ ...event,
411
+ activeIndex,
412
+ overIndex,
413
+ });
414
+ } else {
415
+ onValueChange?.(newColumns);
416
+ }
417
+ }
418
+ }
419
+ }
420
+
421
+ setActiveId(null);
422
+ hasMovedRef.current = false;
423
+ },
424
+ [value, getColumn, getItemValue, onValueChange, onMove, kanbanProps.onDragEnd],
425
+ );
426
+
427
+ const onDragCancel = React.useCallback(
428
+ (event: DragCancelEvent) => {
429
+ kanbanProps.onDragCancel?.(event);
430
+
431
+ if (event.activatorEvent.defaultPrevented) return;
432
+
433
+ setActiveId(null);
434
+ hasMovedRef.current = false;
435
+ },
436
+ [kanbanProps.onDragCancel],
437
+ );
438
+
439
+ const announcements: Announcements = React.useMemo(
440
+ () => ({
441
+ onDragStart({ active }) {
442
+ const isColumn = active.id in value;
443
+ const itemType = isColumn ? "column" : "item";
444
+ const position = isColumn
445
+ ? Object.keys(value).indexOf(active.id as string) + 1
446
+ : (() => {
447
+ const column = getColumn(active.id);
448
+ if (!column || !value[column]) return 1;
449
+ return value[column].findIndex((item) => getItemValue(item) === active.id) + 1;
450
+ })();
451
+ const total = isColumn
452
+ ? Object.keys(value).length
453
+ : (() => {
454
+ const column = getColumn(active.id);
455
+ return column ? (value[column]?.length ?? 0) : 0;
456
+ })();
457
+
458
+ return `Picked up ${itemType} at position ${position} of ${total}`;
459
+ },
460
+ onDragOver({ active, over }) {
461
+ if (!over) return;
462
+
463
+ const isColumn = active.id in value;
464
+ const itemType = isColumn ? "column" : "item";
465
+ const position = isColumn
466
+ ? Object.keys(value).indexOf(over.id as string) + 1
467
+ : (() => {
468
+ const column = getColumn(over.id);
469
+ if (!column || !value[column]) return 1;
470
+ return value[column].findIndex((item) => getItemValue(item) === over.id) + 1;
471
+ })();
472
+ const total = isColumn
473
+ ? Object.keys(value).length
474
+ : (() => {
475
+ const column = getColumn(over.id);
476
+ return column ? (value[column]?.length ?? 0) : 0;
477
+ })();
478
+
479
+ const overColumn = getColumn(over.id);
480
+ const activeColumn = getColumn(active.id);
481
+
482
+ if (isColumn) {
483
+ return `${itemType} is now at position ${position} of ${total}`;
484
+ }
485
+
486
+ if (activeColumn !== overColumn) {
487
+ return `${itemType} is now at position ${position} of ${total} in ${overColumn}`;
488
+ }
489
+
490
+ return `${itemType} is now at position ${position} of ${total}`;
491
+ },
492
+ onDragEnd({ active, over }) {
493
+ if (!over) return;
494
+
495
+ const isColumn = active.id in value;
496
+ const itemType = isColumn ? "column" : "item";
497
+ const position = isColumn
498
+ ? Object.keys(value).indexOf(over.id as string) + 1
499
+ : (() => {
500
+ const column = getColumn(over.id);
501
+ if (!column || !value[column]) return 1;
502
+ return value[column].findIndex((item) => getItemValue(item) === over.id) + 1;
503
+ })();
504
+ const total = isColumn
505
+ ? Object.keys(value).length
506
+ : (() => {
507
+ const column = getColumn(over.id);
508
+ return column ? (value[column]?.length ?? 0) : 0;
509
+ })();
510
+
511
+ const overColumn = getColumn(over.id);
512
+ const activeColumn = getColumn(active.id);
513
+
514
+ if (isColumn) {
515
+ return `${itemType} was dropped at position ${position} of ${total}`;
516
+ }
517
+
518
+ if (activeColumn !== overColumn) {
519
+ return `${itemType} was dropped at position ${position} of ${total} in ${overColumn}`;
520
+ }
521
+
522
+ return `${itemType} was dropped at position ${position} of ${total}`;
523
+ },
524
+ onDragCancel({ active }) {
525
+ const isColumn = active.id in value;
526
+ const itemType = isColumn ? "column" : "item";
527
+ return `Dragging was cancelled. ${itemType} was dropped.`;
528
+ },
529
+ }),
530
+ [value, getColumn, getItemValue],
531
+ );
532
+
533
+ const contextValue = React.useMemo<KanbanContextValue<T>>(
534
+ () => ({
535
+ id,
536
+ items: value,
537
+ modifiers,
538
+ strategy,
539
+ orientation,
540
+ activeId,
541
+ setActiveId,
542
+ getItemValue,
543
+ flatCursor,
544
+ }),
545
+ [id, value, activeId, modifiers, strategy, orientation, getItemValue, flatCursor],
546
+ );
547
+
548
+ return (
549
+ <KanbanContext.Provider value={contextValue as KanbanContextValue<unknown>}>
550
+ <DndContext
551
+ collisionDetection={collisionDetection}
552
+ modifiers={modifiers}
553
+ sensors={sensors}
554
+ {...kanbanProps}
555
+ id={id}
556
+ measuring={{
557
+ droppable: {
558
+ strategy: MeasuringStrategy.Always,
559
+ },
560
+ }}
561
+ onDragStart={onDragStart}
562
+ onDragOver={onDragOver}
563
+ onDragEnd={onDragEnd}
564
+ onDragCancel={onDragCancel}
565
+ accessibility={{
566
+ announcements,
567
+ screenReaderInstructions: {
568
+ draggable: `
569
+ To pick up a kanban item or column, press space or enter.
570
+ While dragging, use the arrow keys to move the item.
571
+ Press space or enter again to drop the item in its new position, or press escape to cancel.
572
+ `,
573
+ },
574
+ ...accessibility,
575
+ }}
576
+ />
577
+ </KanbanContext.Provider>
578
+ );
579
+ }
580
+
581
+ const KanbanBoardContext = React.createContext<boolean>(false);
582
+ KanbanBoardContext.displayName = BOARD_NAME;
583
+
584
+ interface KanbanBoardProps extends React.ComponentPropsWithoutRef<"div"> {
585
+ children: React.ReactNode;
586
+ asChild?: boolean;
587
+ }
588
+
589
+ const KanbanBoard = React.forwardRef<HTMLDivElement, KanbanBoardProps>((props, forwardedRef) => {
590
+ const { asChild, className, ...boardProps } = props;
591
+
592
+ const context = useKanbanContext(BOARD_NAME);
593
+
594
+ const columns = React.useMemo(() => {
595
+ return Object.keys(context.items);
596
+ }, [context.items]);
597
+
598
+ const BoardPrimitive = asChild ? Slot : "div";
599
+
600
+ return (
601
+ <KanbanBoardContext.Provider value={true}>
602
+ <SortableContext
603
+ items={columns}
604
+ strategy={context.orientation === "horizontal" ? horizontalListSortingStrategy : verticalListSortingStrategy}
605
+ >
606
+ <BoardPrimitive
607
+ aria-orientation={context.orientation}
608
+ data-orientation={context.orientation}
609
+ data-slot="kanban-board"
610
+ {...boardProps}
611
+ ref={forwardedRef}
612
+ className={cn(
613
+ "flex size-full gap-4",
614
+ context.orientation === "horizontal" ? "flex-row" : "flex-col",
615
+ className,
616
+ )}
617
+ />
618
+ </SortableContext>
619
+ </KanbanBoardContext.Provider>
620
+ );
621
+ });
622
+ KanbanBoard.displayName = BOARD_NAME;
623
+
624
+ interface KanbanColumnContextValue {
625
+ id: string;
626
+ attributes: DraggableAttributes;
627
+ listeners: DraggableSyntheticListeners | undefined;
628
+ setActivatorNodeRef: (node: HTMLElement | null) => void;
629
+ isDragging?: boolean;
630
+ disabled?: boolean;
631
+ }
632
+
633
+ const KanbanColumnContext = React.createContext<KanbanColumnContextValue | null>(null);
634
+ KanbanColumnContext.displayName = COLUMN_NAME;
635
+
636
+ function useKanbanColumnContext(consumerName: string) {
637
+ const context = React.useContext(KanbanColumnContext);
638
+ if (!context) {
639
+ throw new Error(`\`${consumerName}\` must be used within \`${COLUMN_NAME}\``);
640
+ }
641
+ return context;
642
+ }
643
+
644
+ const animateLayoutChanges: AnimateLayoutChanges = (args) =>
645
+ defaultAnimateLayoutChanges({ ...args, wasDragging: true });
646
+
647
+ interface KanbanColumnProps extends React.ComponentPropsWithoutRef<"div"> {
648
+ value: UniqueIdentifier;
649
+ children: React.ReactNode;
650
+ asChild?: boolean;
651
+ asHandle?: boolean;
652
+ disabled?: boolean;
653
+ }
654
+
655
+ const KanbanColumn = React.forwardRef<HTMLDivElement, KanbanColumnProps>((props, forwardedRef) => {
656
+ const { value, asChild, asHandle, disabled, className, style, ...columnProps } = props;
657
+
658
+ const id = React.useId();
659
+ const context = useKanbanContext(COLUMN_NAME);
660
+ const inBoard = React.useContext(KanbanBoardContext);
661
+ const inOverlay = React.useContext(KanbanOverlayContext);
662
+
663
+ if (!inBoard && !inOverlay) {
664
+ throw new Error(`\`${COLUMN_NAME}\` must be used within \`${BOARD_NAME}\` or \`${OVERLAY_NAME}\``);
665
+ }
666
+
667
+ if (value === "") {
668
+ throw new Error(`\`${COLUMN_NAME}\` value cannot be an empty string`);
669
+ }
670
+
671
+ const { attributes, listeners, setNodeRef, setActivatorNodeRef, transform, transition, isDragging } = useSortable({
672
+ id: value,
673
+ disabled,
674
+ animateLayoutChanges,
675
+ });
676
+
677
+ const composedRef = useComposedRefs(forwardedRef, (node) => {
678
+ if (disabled) return;
679
+ setNodeRef(node);
680
+ });
681
+
682
+ const composedStyle = React.useMemo<React.CSSProperties>(() => {
683
+ return {
684
+ transform: CSS.Transform.toString(transform),
685
+ transition,
686
+ ...style,
687
+ };
688
+ }, [transform, transition, style]);
689
+
690
+ const items = React.useMemo(() => {
691
+ const items = context.items[value] ?? [];
692
+ return items.map((item) => context.getItemValue(item));
693
+ }, [context.items, value, context.getItemValue]);
694
+
695
+ const columnContext = React.useMemo<KanbanColumnContextValue>(
696
+ () => ({
697
+ id,
698
+ attributes,
699
+ listeners,
700
+ setActivatorNodeRef,
701
+ isDragging,
702
+ disabled,
703
+ }),
704
+ [id, attributes, listeners, setActivatorNodeRef, isDragging, disabled],
705
+ );
706
+
707
+ const ColumnPrimitive = asChild ? Slot : "div";
708
+
709
+ return (
710
+ <KanbanColumnContext.Provider value={columnContext}>
711
+ <SortableContext
712
+ items={items}
713
+ strategy={context.orientation === "horizontal" ? horizontalListSortingStrategy : verticalListSortingStrategy}
714
+ >
715
+ <ColumnPrimitive
716
+ id={id}
717
+ data-disabled={disabled}
718
+ data-dragging={isDragging ? "" : undefined}
719
+ data-slot="kanban-column"
720
+ {...columnProps}
721
+ {...(asHandle && !disabled ? attributes : {})}
722
+ {...(asHandle && !disabled ? listeners : {})}
723
+ ref={composedRef}
724
+ style={composedStyle}
725
+ className={cn(
726
+ "flex size-full w-full flex-col gap-2 rounded-lg border bg-zinc-100 p-2.5 aria-disabled:pointer-events-none aria-disabled:opacity-50 dark:bg-zinc-900",
727
+ {
728
+ "touch-none select-none": asHandle,
729
+ "cursor-default": context.flatCursor,
730
+ "data-dragging:cursor-grabbing": !context.flatCursor,
731
+ "cursor-grab": !isDragging && asHandle && !context.flatCursor,
732
+ "opacity-50": isDragging,
733
+ "pointer-events-none opacity-50": disabled,
734
+ },
735
+ className,
736
+ )}
737
+ />
738
+ </SortableContext>
739
+ </KanbanColumnContext.Provider>
740
+ );
741
+ });
742
+ KanbanColumn.displayName = COLUMN_NAME;
743
+
744
+ interface KanbanColumnHandleProps extends React.ComponentPropsWithoutRef<"button"> {
745
+ asChild?: boolean;
746
+ }
747
+
748
+ const KanbanColumnHandle = React.forwardRef<HTMLButtonElement, KanbanColumnHandleProps>((props, forwardedRef) => {
749
+ const { asChild, disabled, className, ...columnHandleProps } = props;
750
+
751
+ const context = useKanbanContext(COLUMN_NAME);
752
+ const columnContext = useKanbanColumnContext(COLUMN_HANDLE_NAME);
753
+
754
+ const isDisabled = disabled ?? columnContext.disabled;
755
+
756
+ const composedRef = useComposedRefs(forwardedRef, (node) => {
757
+ if (isDisabled) return;
758
+ columnContext.setActivatorNodeRef(node);
759
+ });
760
+
761
+ const HandlePrimitive = asChild ? Slot : "button";
762
+
763
+ return (
764
+ <HandlePrimitive
765
+ type="button"
766
+ aria-controls={columnContext.id}
767
+ data-disabled={isDisabled}
768
+ data-dragging={columnContext.isDragging ? "" : undefined}
769
+ data-slot="kanban-column-handle"
770
+ {...columnHandleProps}
771
+ {...(isDisabled ? {} : columnContext.attributes)}
772
+ {...(isDisabled ? {} : columnContext.listeners)}
773
+ ref={composedRef}
774
+ className={cn(
775
+ "select-none disabled:pointer-events-none disabled:opacity-50",
776
+ context.flatCursor ? "cursor-default" : "cursor-grab data-dragging:cursor-grabbing",
777
+ className,
778
+ )}
779
+ disabled={isDisabled}
780
+ />
781
+ );
782
+ });
783
+ KanbanColumnHandle.displayName = COLUMN_HANDLE_NAME;
784
+
785
+ interface KanbanItemContextValue {
786
+ id: string;
787
+ attributes: DraggableAttributes;
788
+ listeners: DraggableSyntheticListeners | undefined;
789
+ setActivatorNodeRef: (node: HTMLElement | null) => void;
790
+ isDragging?: boolean;
791
+ disabled?: boolean;
792
+ }
793
+
794
+ const KanbanItemContext = React.createContext<KanbanItemContextValue | null>(null);
795
+ KanbanItemContext.displayName = ITEM_NAME;
796
+
797
+ function useKanbanItemContext(consumerName: string) {
798
+ const context = React.useContext(KanbanItemContext);
799
+ if (!context) {
800
+ throw new Error(`\`${consumerName}\` must be used within \`${ITEM_NAME}\``);
801
+ }
802
+ return context;
803
+ }
804
+
805
+ interface KanbanItemProps extends React.ComponentPropsWithoutRef<"div"> {
806
+ value: UniqueIdentifier;
807
+ asHandle?: boolean;
808
+ asChild?: boolean;
809
+ disabled?: boolean;
810
+ }
811
+
812
+ const KanbanItem = React.forwardRef<HTMLDivElement, KanbanItemProps>((props, forwardedRef) => {
813
+ const { value, style, asHandle, asChild, disabled, className, ...itemProps } = props;
814
+
815
+ const id = React.useId();
816
+ const context = useKanbanContext(ITEM_NAME);
817
+ const inBoard = React.useContext(KanbanBoardContext);
818
+ const inOverlay = React.useContext(KanbanOverlayContext);
819
+
820
+ if (!inBoard && !inOverlay) {
821
+ throw new Error(`\`${ITEM_NAME}\` must be used within \`${BOARD_NAME}\``);
822
+ }
823
+
824
+ const { attributes, listeners, setNodeRef, setActivatorNodeRef, transform, transition, isDragging } = useSortable({
825
+ id: value,
826
+ disabled,
827
+ });
828
+
829
+ if (value === "") {
830
+ throw new Error(`\`${ITEM_NAME}\` value cannot be an empty string`);
831
+ }
832
+
833
+ const composedRef = useComposedRefs(forwardedRef, (node) => {
834
+ if (disabled) return;
835
+ setNodeRef(node);
836
+ });
837
+
838
+ const composedStyle = React.useMemo<React.CSSProperties>(() => {
839
+ return {
840
+ transform: CSS.Transform.toString(transform),
841
+ transition,
842
+ ...style,
843
+ };
844
+ }, [transform, transition, style]);
845
+
846
+ const itemContext = React.useMemo<KanbanItemContextValue>(
847
+ () => ({
848
+ id,
849
+ attributes,
850
+ listeners,
851
+ setActivatorNodeRef,
852
+ isDragging,
853
+ disabled,
854
+ }),
855
+ [id, attributes, listeners, setActivatorNodeRef, isDragging, disabled],
856
+ );
857
+
858
+ const ItemPrimitive = asChild ? Slot : "div";
859
+
860
+ return (
861
+ <KanbanItemContext.Provider value={itemContext}>
862
+ <ItemPrimitive
863
+ id={id}
864
+ data-disabled={disabled}
865
+ data-dragging={isDragging ? "" : undefined}
866
+ data-slot="kanban-item"
867
+ {...itemProps}
868
+ {...(asHandle && !disabled ? attributes : {})}
869
+ {...(asHandle && !disabled ? listeners : {})}
870
+ ref={composedRef}
871
+ style={composedStyle}
872
+ className={cn(
873
+ "focus-visible:ring-ring focus-visible:ring-1 focus-visible:ring-offset-1 focus-visible:outline-hidden",
874
+ {
875
+ "touch-none select-none": asHandle,
876
+ "cursor-default": context.flatCursor,
877
+ "data-dragging:cursor-grabbing": !context.flatCursor,
878
+ "cursor-grab": !isDragging && asHandle && !context.flatCursor,
879
+ "opacity-50": isDragging,
880
+ "pointer-events-none opacity-50": disabled,
881
+ },
882
+ className,
883
+ )}
884
+ />
885
+ </KanbanItemContext.Provider>
886
+ );
887
+ });
888
+ KanbanItem.displayName = ITEM_NAME;
889
+
890
+ interface KanbanItemHandleProps extends React.ComponentPropsWithoutRef<"button"> {
891
+ asChild?: boolean;
892
+ }
893
+
894
+ const KanbanItemHandle = React.forwardRef<HTMLButtonElement, KanbanItemHandleProps>((props, forwardedRef) => {
895
+ const { asChild, disabled, className, ...itemHandleProps } = props;
896
+
897
+ const context = useKanbanContext(ITEM_HANDLE_NAME);
898
+ const itemContext = useKanbanItemContext(ITEM_HANDLE_NAME);
899
+
900
+ const isDisabled = disabled ?? itemContext.disabled;
901
+
902
+ const composedRef = useComposedRefs(forwardedRef, (node) => {
903
+ if (isDisabled) return;
904
+ itemContext.setActivatorNodeRef(node);
905
+ });
906
+
907
+ const HandlePrimitive = asChild ? Slot : "button";
908
+
909
+ return (
910
+ <HandlePrimitive
911
+ type="button"
912
+ aria-controls={itemContext.id}
913
+ data-disabled={isDisabled}
914
+ data-dragging={itemContext.isDragging ? "" : undefined}
915
+ data-slot="kanban-item-handle"
916
+ {...itemHandleProps}
917
+ {...(isDisabled ? {} : itemContext.attributes)}
918
+ {...(isDisabled ? {} : itemContext.listeners)}
919
+ ref={composedRef}
920
+ className={cn(
921
+ "select-none disabled:pointer-events-none disabled:opacity-50",
922
+ context.flatCursor ? "cursor-default" : "cursor-grab data-dragging:cursor-grabbing",
923
+ className,
924
+ )}
925
+ disabled={isDisabled}
926
+ />
927
+ );
928
+ });
929
+ KanbanItemHandle.displayName = ITEM_HANDLE_NAME;
930
+
931
+ const KanbanOverlayContext = React.createContext(false);
932
+ KanbanOverlayContext.displayName = OVERLAY_NAME;
933
+
934
+ const dropAnimation: DropAnimation = {
935
+ sideEffects: defaultDropAnimationSideEffects({
936
+ styles: {
937
+ active: {
938
+ opacity: "0.4",
939
+ },
940
+ },
941
+ }),
942
+ };
943
+
944
+ interface KanbanOverlayProps extends Omit<React.ComponentPropsWithoutRef<typeof DragOverlay>, "children"> {
945
+ container?: Element | DocumentFragment | null;
946
+ children?: ((params: { value: UniqueIdentifier; variant: "column" | "item" }) => React.ReactNode) | React.ReactNode;
947
+ }
948
+
949
+ function KanbanOverlay(props: KanbanOverlayProps) {
950
+ const { container: containerProp, children, ...overlayProps } = props;
951
+
952
+ const context = useKanbanContext(OVERLAY_NAME);
953
+
954
+ const [mounted, setMounted] = React.useState(false);
955
+ React.useLayoutEffect(() => setMounted(true), []);
956
+
957
+ const container = containerProp ?? (mounted ? globalThis.document?.body : null);
958
+
959
+ if (!container) return null;
960
+
961
+ const variant = context.activeId && context.activeId in context.items ? "column" : "item";
962
+
963
+ return ReactDOM.createPortal(
964
+ <DragOverlay
965
+ dropAnimation={dropAnimation}
966
+ modifiers={context.modifiers}
967
+ className={cn(!context.flatCursor && "cursor-grabbing")}
968
+ {...overlayProps}
969
+ >
970
+ <KanbanOverlayContext.Provider value={true}>
971
+ {context.activeId && children
972
+ ? typeof children === "function"
973
+ ? children({
974
+ value: context.activeId,
975
+ variant,
976
+ })
977
+ : children
978
+ : null}
979
+ </KanbanOverlayContext.Provider>
980
+ </DragOverlay>,
981
+ container,
982
+ );
983
+ }
984
+
985
+ export {
986
+ KanbanBoard as Board,
987
+ KanbanColumn as Column,
988
+ KanbanColumnHandle as ColumnHandle,
989
+ KanbanItem as Item,
990
+ KanbanItemHandle as ItemHandle,
991
+ KanbanRoot as Kanban,
992
+ KanbanBoard,
993
+ KanbanColumn,
994
+ KanbanColumnHandle,
995
+ KanbanItem,
996
+ KanbanItemHandle,
997
+ KanbanOverlay,
998
+ KanbanOverlay as Overlay,
999
+ //
1000
+ KanbanRoot as Root,
1001
+ };