@websolutespa/payload-plugin-bowl 2.0.1 → 3.0.1

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 (455) hide show
  1. package/CHANGELOG.md +23 -4
  2. package/README.md +1 -1
  3. package/dist/blocks/MenuItem.js +219 -0
  4. package/dist/blocks/MenuItem.js.map +1 -0
  5. package/dist/blocks/index.js +4 -0
  6. package/dist/blocks/index.js.map +1 -0
  7. package/dist/blocks/withComponentBlock.js +31 -0
  8. package/dist/blocks/withComponentBlock.js.map +1 -0
  9. package/dist/bowl.js +331 -0
  10. package/dist/bowl.js.map +1 -0
  11. package/dist/collections/Address.js +7 -0
  12. package/dist/collections/Address.js.map +1 -0
  13. package/dist/collections/Category.js +94 -0
  14. package/dist/collections/Category.js.map +1 -0
  15. package/dist/collections/ConsentPreference.js +34 -0
  16. package/dist/collections/ConsentPreference.js.map +1 -0
  17. package/dist/collections/Continent.js +24 -0
  18. package/dist/collections/Continent.js.map +1 -0
  19. package/dist/collections/Country.js +66 -0
  20. package/dist/collections/Country.js.map +1 -0
  21. package/dist/collections/CountryZone.js +24 -0
  22. package/dist/collections/CountryZone.js.map +1 -0
  23. package/dist/collections/EmailConfig.js +84 -0
  24. package/dist/collections/EmailConfig.js.map +1 -0
  25. package/dist/collections/EndUsers.js +24 -0
  26. package/dist/collections/EndUsers.js.map +1 -0
  27. package/dist/collections/Label.js +26 -0
  28. package/dist/collections/Label.js.map +1 -0
  29. package/dist/collections/Language.js +35 -0
  30. package/dist/collections/Language.js.map +1 -0
  31. package/dist/collections/LegalNotice.js +29 -0
  32. package/dist/collections/LegalNotice.js.map +1 -0
  33. package/dist/collections/Market.js +106 -0
  34. package/dist/collections/Market.js.map +1 -0
  35. package/dist/collections/Media.js +40 -0
  36. package/dist/collections/Media.js.map +1 -0
  37. package/dist/collections/Menu.js +49 -0
  38. package/dist/collections/Menu.js.map +1 -0
  39. package/dist/collections/Municipality.js +68 -0
  40. package/dist/collections/Municipality.js.map +1 -0
  41. package/dist/collections/Province.js +59 -0
  42. package/dist/collections/Province.js.map +1 -0
  43. package/dist/collections/Redirect.js +90 -0
  44. package/dist/collections/Redirect.js.map +1 -0
  45. package/dist/collections/Region.js +45 -0
  46. package/dist/collections/Region.js.map +1 -0
  47. package/dist/collections/SubContinent.js +36 -0
  48. package/dist/collections/SubContinent.js.map +1 -0
  49. package/dist/collections/Template.js +79 -0
  50. package/dist/collections/Template.js.map +1 -0
  51. package/dist/collections/Users.js +11 -0
  52. package/dist/collections/Users.js.map +1 -0
  53. package/dist/components/Category/CategoryMenu.js +47 -0
  54. package/dist/components/Category/CategoryMenu.js.map +1 -0
  55. package/dist/components/Category/CategoryTree.js +430 -0
  56. package/dist/components/Category/CategoryTree.js.map +1 -0
  57. package/dist/components/Category/CategoryTree.scss +330 -0
  58. package/dist/components/Category/CategoryTreeRoute.js +51 -0
  59. package/dist/components/Category/CategoryTreeRoute.js.map +1 -0
  60. package/dist/components/Category/category.service.js +32 -0
  61. package/dist/components/Category/category.service.js.map +1 -0
  62. package/dist/components/DataTree/DataTree.js +281 -0
  63. package/dist/components/DataTree/DataTree.js.map +1 -0
  64. package/dist/components/DataTree/DataTree.scss +363 -0
  65. package/dist/components/DataTree/DataTreeProvider.js +67 -0
  66. package/dist/components/DataTree/DataTreeProvider.js.map +1 -0
  67. package/dist/components/DataTree/EventEmitter.js +38 -0
  68. package/dist/components/DataTree/EventEmitter.js.map +1 -0
  69. package/dist/components/DataTree/useDataTree.js +52 -0
  70. package/dist/components/DataTree/useDataTree.js.map +1 -0
  71. package/dist/components/DecoratedList/DecoratedList.js +17 -0
  72. package/dist/components/DecoratedList/DecoratedList.js.map +1 -0
  73. package/dist/components/IconServer/IconServer.js +15 -0
  74. package/dist/components/IconServer/IconServer.js.map +1 -0
  75. package/dist/components/IconServer/IconServer.scss +14 -0
  76. package/dist/components/ImportExport/ImportExportList.js +91 -0
  77. package/dist/components/ImportExport/ImportExportList.js.map +1 -0
  78. package/dist/components/ImportExport/ImportExportList.scss +70 -0
  79. package/dist/components/ImportExport/ImportExportRedirect.js +142 -0
  80. package/dist/components/ImportExport/ImportExportRedirect.js.map +1 -0
  81. package/dist/components/ImportExport/ImportModal.js +458 -0
  82. package/dist/components/ImportExport/ImportModal.js.map +1 -0
  83. package/dist/components/ImportExport/ImportModal.scss +99 -0
  84. package/dist/components/ImportExport/types.js +3 -0
  85. package/dist/components/ImportExport/types.js.map +1 -0
  86. package/dist/components/LeaveWithoutSaving/LeaveWithoutSaving.js +83 -0
  87. package/dist/components/LeaveWithoutSaving/LeaveWithoutSaving.js.map +1 -0
  88. package/dist/components/LeaveWithoutSaving/LeaveWithoutSaving.scss +46 -0
  89. package/dist/components/LeaveWithoutSaving/usePreventLeave.js +119 -0
  90. package/dist/components/LeaveWithoutSaving/usePreventLeave.js.map +1 -0
  91. package/dist/components/LocalizedDescription/LocalizedDescriptionClient.js +15 -0
  92. package/dist/components/LocalizedDescription/LocalizedDescriptionClient.js.map +1 -0
  93. package/dist/components/LocalizedDescription/LocalizedDescriptionServer.js +13 -0
  94. package/dist/components/LocalizedDescription/LocalizedDescriptionServer.js.map +1 -0
  95. package/dist/components/LogoServer/LogoServer.js +20 -0
  96. package/dist/components/LogoServer/LogoServer.js.map +1 -0
  97. package/dist/components/LogoServer/LogoServer.scss +21 -0
  98. package/dist/core/access/access.js +181 -0
  99. package/dist/core/access/access.js.map +1 -0
  100. package/dist/core/access/access.test.js +454 -0
  101. package/dist/core/access/access.test.js.map +1 -0
  102. package/dist/core/access/index.js +3 -0
  103. package/dist/core/access/index.js.map +1 -0
  104. package/dist/core/api/action.service.js +441 -0
  105. package/dist/core/api/action.service.js.map +1 -0
  106. package/dist/core/api/action.service.test.js +218 -0
  107. package/dist/core/api/action.service.test.js.map +1 -0
  108. package/dist/core/api/cache.service.js +33 -0
  109. package/dist/core/api/cache.service.js.map +1 -0
  110. package/dist/core/api/cache.service.test.js +33 -0
  111. package/dist/core/api/cache.service.test.js.map +1 -0
  112. package/dist/core/api/category.service.js +53 -0
  113. package/dist/core/api/category.service.js.map +1 -0
  114. package/dist/core/api/collection.service.js +457 -0
  115. package/dist/core/api/collection.service.js.map +1 -0
  116. package/dist/core/api/collection.service.test.js +318 -0
  117. package/dist/core/api/collection.service.test.js.map +1 -0
  118. package/dist/core/api/email.service.js +84 -0
  119. package/dist/core/api/email.service.js.map +1 -0
  120. package/dist/core/api/global.service.js +18 -0
  121. package/dist/core/api/global.service.js.map +1 -0
  122. package/dist/core/api/health.service.js +12 -0
  123. package/dist/core/api/health.service.js.map +1 -0
  124. package/dist/core/api/index.js +16 -0
  125. package/dist/core/api/index.js.map +1 -0
  126. package/dist/core/api/locale.service.js +58 -0
  127. package/dist/core/api/locale.service.js.map +1 -0
  128. package/dist/core/api/locale.service.test.js +46 -0
  129. package/dist/core/api/locale.service.test.js.map +1 -0
  130. package/dist/core/api/menu.service.js +81 -0
  131. package/dist/core/api/menu.service.js.map +1 -0
  132. package/dist/core/api/menu.service.test.js +300 -0
  133. package/dist/core/api/menu.service.test.js.map +1 -0
  134. package/dist/core/api/page.service.js +171 -0
  135. package/dist/core/api/page.service.js.map +1 -0
  136. package/dist/core/api/page.service.test.js +68 -0
  137. package/dist/core/api/page.service.test.js.map +1 -0
  138. package/dist/core/api/pagination.service.js +29 -0
  139. package/dist/core/api/pagination.service.js.map +1 -0
  140. package/dist/core/api/pagination.service.test.js +175 -0
  141. package/dist/core/api/pagination.service.test.js.map +1 -0
  142. package/dist/core/api/redirect.service.js +106 -0
  143. package/dist/core/api/redirect.service.js.map +1 -0
  144. package/dist/core/api/redirect.service.test.js +106 -0
  145. package/dist/core/api/redirect.service.test.js.map +1 -0
  146. package/dist/core/api/route.service.js +451 -0
  147. package/dist/core/api/route.service.js.map +1 -0
  148. package/dist/core/api/route.service.test.js +214 -0
  149. package/dist/core/api/route.service.test.js.map +1 -0
  150. package/dist/core/api/static.service.js +249 -0
  151. package/dist/core/api/static.service.js.map +1 -0
  152. package/dist/core/api/static.service.test.js +240 -0
  153. package/dist/core/api/static.service.test.js.map +1 -0
  154. package/dist/core/api/store.service.js +336 -0
  155. package/dist/core/api/store.service.js.map +1 -0
  156. package/dist/core/api/store.service.test.js +105 -0
  157. package/dist/core/api/store.service.test.js.map +1 -0
  158. package/dist/core/api/types.js +21 -0
  159. package/dist/core/api/types.js.map +1 -0
  160. package/dist/core/api/utils.js +83 -0
  161. package/dist/core/api/utils.js.map +1 -0
  162. package/dist/core/api/where.service.js +231 -0
  163. package/dist/core/api/where.service.js.map +1 -0
  164. package/dist/core/collections/index.js +12 -0
  165. package/dist/core/collections/index.js.map +1 -0
  166. package/dist/core/collections/withAction.js +91 -0
  167. package/dist/core/collections/withAction.js.map +1 -0
  168. package/dist/core/collections/withAction.test.js +68 -0
  169. package/dist/core/collections/withAction.test.js.map +1 -0
  170. package/dist/core/collections/withAddress.js +122 -0
  171. package/dist/core/collections/withAddress.js.map +1 -0
  172. package/dist/core/collections/withBlock.js +17 -0
  173. package/dist/core/collections/withBlock.js.map +1 -0
  174. package/dist/core/collections/withBlock.test.js +68 -0
  175. package/dist/core/collections/withBlock.test.js.map +1 -0
  176. package/dist/core/collections/withCollection.js +61 -0
  177. package/dist/core/collections/withCollection.js.map +1 -0
  178. package/dist/core/collections/withCollection.test.js +64 -0
  179. package/dist/core/collections/withCollection.test.js.map +1 -0
  180. package/dist/core/collections/withEndUser.js +301 -0
  181. package/dist/core/collections/withEndUser.js.map +1 -0
  182. package/dist/core/collections/withGlobal.js +27 -0
  183. package/dist/core/collections/withGlobal.js.map +1 -0
  184. package/dist/core/collections/withGlobal.test.js +57 -0
  185. package/dist/core/collections/withGlobal.test.js.map +1 -0
  186. package/dist/core/collections/withMenu.js +19 -0
  187. package/dist/core/collections/withMenu.js.map +1 -0
  188. package/dist/core/collections/withMenu.test.js +63 -0
  189. package/dist/core/collections/withMenu.test.js.map +1 -0
  190. package/dist/core/collections/withPage.js +126 -0
  191. package/dist/core/collections/withPage.js.map +1 -0
  192. package/dist/core/collections/withPage.test.js +103 -0
  193. package/dist/core/collections/withPage.test.js.map +1 -0
  194. package/dist/core/collections/withStaticCollection.js +60 -0
  195. package/dist/core/collections/withStaticCollection.js.map +1 -0
  196. package/dist/core/collections/withStaticCollection.test.js +84 -0
  197. package/dist/core/collections/withStaticCollection.test.js.map +1 -0
  198. package/dist/core/collections/withUser.js +56 -0
  199. package/dist/core/collections/withUser.js.map +1 -0
  200. package/dist/core/decorators/category.js +28 -0
  201. package/dist/core/decorators/category.js.map +1 -0
  202. package/dist/core/decorators/components.js +9 -0
  203. package/dist/core/decorators/components.js.map +1 -0
  204. package/dist/core/decorators/href.js +25 -0
  205. package/dist/core/decorators/href.js.map +1 -0
  206. package/dist/core/decorators/index.js +11 -0
  207. package/dist/core/decorators/index.js.map +1 -0
  208. package/dist/core/decorators/localize.js +27 -0
  209. package/dist/core/decorators/localize.js.map +1 -0
  210. package/dist/core/decorators/menu.js +246 -0
  211. package/dist/core/decorators/menu.js.map +1 -0
  212. package/dist/core/decorators/nav.js +42 -0
  213. package/dist/core/decorators/nav.js.map +1 -0
  214. package/dist/core/decorators/rich-text.js +39 -0
  215. package/dist/core/decorators/rich-text.js.map +1 -0
  216. package/dist/core/decorators/schema.js +16 -0
  217. package/dist/core/decorators/schema.js.map +1 -0
  218. package/dist/core/decorators/upload.js +44 -0
  219. package/dist/core/decorators/upload.js.map +1 -0
  220. package/dist/core/encryption/encryption.js +66 -0
  221. package/dist/core/encryption/encryption.js.map +1 -0
  222. package/dist/core/encryption/index.js +3 -0
  223. package/dist/core/encryption/index.js.map +1 -0
  224. package/dist/core/fields/index.js +28 -0
  225. package/dist/core/fields/index.js.map +1 -0
  226. package/dist/core/fields/withAbstract.js +15 -0
  227. package/dist/core/fields/withAbstract.js.map +1 -0
  228. package/dist/core/fields/withAbstract.test.js +72 -0
  229. package/dist/core/fields/withAbstract.test.js.map +1 -0
  230. package/dist/core/fields/withAnchor.js +56 -0
  231. package/dist/core/fields/withAnchor.js.map +1 -0
  232. package/dist/core/fields/withCategory.js +21 -0
  233. package/dist/core/fields/withCategory.js.map +1 -0
  234. package/dist/core/fields/withCategory.test.js +63 -0
  235. package/dist/core/fields/withCategory.test.js.map +1 -0
  236. package/dist/core/fields/withCheckbox.js +19 -0
  237. package/dist/core/fields/withCheckbox.js.map +1 -0
  238. package/dist/core/fields/withCheckbox.test.js +59 -0
  239. package/dist/core/fields/withCheckbox.test.js.map +1 -0
  240. package/dist/core/fields/withComponents.js +17 -0
  241. package/dist/core/fields/withComponents.js.map +1 -0
  242. package/dist/core/fields/withComponents.test.js +62 -0
  243. package/dist/core/fields/withComponents.test.js.map +1 -0
  244. package/dist/core/fields/withDate.js +18 -0
  245. package/dist/core/fields/withDate.js.map +1 -0
  246. package/dist/core/fields/withDate.test.js +56 -0
  247. package/dist/core/fields/withDate.test.js.map +1 -0
  248. package/dist/core/fields/withDescription.js +15 -0
  249. package/dist/core/fields/withDescription.js.map +1 -0
  250. package/dist/core/fields/withDescription.test.js +72 -0
  251. package/dist/core/fields/withDescription.test.js.map +1 -0
  252. package/dist/core/fields/withId.js +19 -0
  253. package/dist/core/fields/withId.js.map +1 -0
  254. package/dist/core/fields/withId.test.js +61 -0
  255. package/dist/core/fields/withId.test.js.map +1 -0
  256. package/dist/core/fields/withIsActive.js +15 -0
  257. package/dist/core/fields/withIsActive.js.map +1 -0
  258. package/dist/core/fields/withIsActive.test.js +59 -0
  259. package/dist/core/fields/withIsActive.test.js.map +1 -0
  260. package/dist/core/fields/withIsDefault.js +15 -0
  261. package/dist/core/fields/withIsDefault.js.map +1 -0
  262. package/dist/core/fields/withIsDefault.test.js +59 -0
  263. package/dist/core/fields/withIsDefault.test.js.map +1 -0
  264. package/dist/core/fields/withLink.js +116 -0
  265. package/dist/core/fields/withLink.js.map +1 -0
  266. package/dist/core/fields/withLink.test.js +144 -0
  267. package/dist/core/fields/withLink.test.js.map +1 -0
  268. package/dist/core/fields/withMarkets.js +21 -0
  269. package/dist/core/fields/withMarkets.js.map +1 -0
  270. package/dist/core/fields/withMarkets.test.js +65 -0
  271. package/dist/core/fields/withMarkets.test.js.map +1 -0
  272. package/dist/core/fields/withMedia.js +20 -0
  273. package/dist/core/fields/withMedia.js.map +1 -0
  274. package/dist/core/fields/withMedia.test.js +41 -0
  275. package/dist/core/fields/withMedia.test.js.map +1 -0
  276. package/dist/core/fields/withMedias.js +25 -0
  277. package/dist/core/fields/withMedias.js.map +1 -0
  278. package/dist/core/fields/withMedias.test.js +46 -0
  279. package/dist/core/fields/withMedias.test.js.map +1 -0
  280. package/dist/core/fields/withName.js +17 -0
  281. package/dist/core/fields/withName.js.map +1 -0
  282. package/dist/core/fields/withName.test.js +59 -0
  283. package/dist/core/fields/withName.test.js.map +1 -0
  284. package/dist/core/fields/withNav.js +28 -0
  285. package/dist/core/fields/withNav.js.map +1 -0
  286. package/dist/core/fields/withNavs.js +53 -0
  287. package/dist/core/fields/withNavs.js.map +1 -0
  288. package/dist/core/fields/withOrder.js +80 -0
  289. package/dist/core/fields/withOrder.js.map +1 -0
  290. package/dist/core/fields/withOrder.test.js +56 -0
  291. package/dist/core/fields/withOrder.test.js.map +1 -0
  292. package/dist/core/fields/withRelated.js +18 -0
  293. package/dist/core/fields/withRelated.js.map +1 -0
  294. package/dist/core/fields/withRelated.test.js +62 -0
  295. package/dist/core/fields/withRelated.test.js.map +1 -0
  296. package/dist/core/fields/withRichText.js +68 -0
  297. package/dist/core/fields/withRichText.js.map +1 -0
  298. package/dist/core/fields/withRichText.test.js +72 -0
  299. package/dist/core/fields/withRichText.test.js.map +1 -0
  300. package/dist/core/fields/withRoles.js +27 -0
  301. package/dist/core/fields/withRoles.js.map +1 -0
  302. package/dist/core/fields/withRoles.test.js +49 -0
  303. package/dist/core/fields/withRoles.test.js.map +1 -0
  304. package/dist/core/fields/withSelect.js +23 -0
  305. package/dist/core/fields/withSelect.js.map +1 -0
  306. package/dist/core/fields/withSelect.test.js +59 -0
  307. package/dist/core/fields/withSelect.test.js.map +1 -0
  308. package/dist/core/fields/withSeoWeight.js +19 -0
  309. package/dist/core/fields/withSeoWeight.js.map +1 -0
  310. package/dist/core/fields/withSlug.js +33 -0
  311. package/dist/core/fields/withSlug.js.map +1 -0
  312. package/dist/core/fields/withSlug.test.js +71 -0
  313. package/dist/core/fields/withSlug.test.js.map +1 -0
  314. package/dist/core/fields/withTemplate.js +49 -0
  315. package/dist/core/fields/withTemplate.js.map +1 -0
  316. package/dist/core/fields/withTemplate.test.js +93 -0
  317. package/dist/core/fields/withTemplate.test.js.map +1 -0
  318. package/dist/core/fields/withTenants.js +21 -0
  319. package/dist/core/fields/withTenants.js.map +1 -0
  320. package/dist/core/fields/withTenants.test.js +42 -0
  321. package/dist/core/fields/withTenants.test.js.map +1 -0
  322. package/dist/core/fields/withText.js +18 -0
  323. package/dist/core/fields/withText.js.map +1 -0
  324. package/dist/core/fields/withText.test.js +56 -0
  325. package/dist/core/fields/withText.test.js.map +1 -0
  326. package/dist/core/fields/withTitle.js +17 -0
  327. package/dist/core/fields/withTitle.js.map +1 -0
  328. package/dist/core/fields/withTitle.test.js +58 -0
  329. package/dist/core/fields/withTitle.test.js.map +1 -0
  330. package/dist/core/index.js +11 -0
  331. package/dist/core/index.js.map +1 -0
  332. package/dist/core/logger/index.js +3 -0
  333. package/dist/core/logger/index.js.map +1 -0
  334. package/dist/core/logger/logger.js +9 -0
  335. package/dist/core/logger/logger.js.map +1 -0
  336. package/dist/core/translations/index.js +3 -0
  337. package/dist/core/translations/index.js.map +1 -0
  338. package/dist/core/translations/translations.js +137 -0
  339. package/dist/core/translations/translations.js.map +1 -0
  340. package/dist/core/translations/translations.test.js +72 -0
  341. package/dist/core/translations/translations.test.js.map +1 -0
  342. package/dist/core/utils/findByIDHandler.js +28 -0
  343. package/dist/core/utils/findByIDHandler.js.map +1 -0
  344. package/dist/core/utils/findHandler.js +31 -0
  345. package/dist/core/utils/findHandler.js.map +1 -0
  346. package/dist/core/utils/getPreviewURL.js +45 -0
  347. package/dist/core/utils/getPreviewURL.js.map +1 -0
  348. package/dist/core/utils/getRequestCollection.js +49 -0
  349. package/dist/core/utils/getRequestCollection.js.map +1 -0
  350. package/dist/core/utils/index.js +7 -0
  351. package/dist/core/utils/index.js.map +1 -0
  352. package/dist/core/utils/mergeCollections.js +18 -0
  353. package/dist/core/utils/mergeCollections.js.map +1 -0
  354. package/dist/core/utils/mergeFields.js +20 -0
  355. package/dist/core/utils/mergeFields.js.map +1 -0
  356. package/dist/core/utils/mergeGlobals.js +17 -0
  357. package/dist/core/utils/mergeGlobals.js.map +1 -0
  358. package/dist/core/utils/richText.js +29 -0
  359. package/dist/core/utils/richText.js.map +1 -0
  360. package/dist/core/utils/sortByGroup.js +36 -0
  361. package/dist/core/utils/sortByGroup.js.map +1 -0
  362. package/dist/debug.js +25 -0
  363. package/dist/debug.js.map +1 -0
  364. package/dist/declaration.d.js +3 -0
  365. package/dist/declaration.d.js.map +1 -0
  366. package/dist/exports/client.d.ts +36 -0
  367. package/dist/exports/client.d.ts.map +1 -0
  368. package/dist/exports/client.js +8 -0
  369. package/dist/exports/client.js.map +1 -0
  370. package/dist/exports/rsc.d.ts +18 -0
  371. package/dist/exports/rsc.d.ts.map +1 -0
  372. package/dist/exports/rsc.js +5 -0
  373. package/dist/exports/rsc.js.map +1 -0
  374. package/dist/fields/color-picker/ColorCell.js +19 -0
  375. package/dist/fields/color-picker/ColorCell.js.map +1 -0
  376. package/dist/fields/color-picker/ColorField.js +131 -0
  377. package/dist/fields/color-picker/ColorField.js.map +1 -0
  378. package/dist/fields/color-picker/index.js +26 -0
  379. package/dist/fields/color-picker/index.js.map +1 -0
  380. package/dist/fields/color-picker/styles.scss +113 -0
  381. package/dist/fields/color-picker/utils.js +6 -0
  382. package/dist/fields/color-picker/utils.js.map +1 -0
  383. package/dist/fields/index.js +3 -0
  384. package/dist/fields/index.js.map +1 -0
  385. package/dist/globals/App.js +97 -0
  386. package/dist/globals/App.js.map +1 -0
  387. package/dist/globals/Locale.js +82 -0
  388. package/dist/globals/Locale.js.map +1 -0
  389. package/dist/globals/LocaleRowLabel.js +16 -0
  390. package/dist/globals/LocaleRowLabel.js.map +1 -0
  391. package/dist/index.d.ts +891 -844
  392. package/dist/index.d.ts.map +1 -0
  393. package/dist/index.js +11 -9263
  394. package/dist/index.js.map +1 -0
  395. package/dist/mapper.js +199 -0
  396. package/dist/mapper.js.map +1 -0
  397. package/dist/options.js +76 -0
  398. package/dist/options.js.map +1 -0
  399. package/dist/test/blocks/blocks.js +13 -0
  400. package/dist/test/blocks/blocks.js.map +1 -0
  401. package/dist/test/collections/ActionCollection.js +12 -0
  402. package/dist/test/collections/ActionCollection.js.map +1 -0
  403. package/dist/test/collections/AdminCollection.js +18 -0
  404. package/dist/test/collections/AdminCollection.js.map +1 -0
  405. package/dist/test/collections/BlockCollection.js +16 -0
  406. package/dist/test/collections/BlockCollection.js.map +1 -0
  407. package/dist/test/collections/Collection.js +12 -0
  408. package/dist/test/collections/Collection.js.map +1 -0
  409. package/dist/test/collections/FieldCollection.js +84 -0
  410. package/dist/test/collections/FieldCollection.js.map +1 -0
  411. package/dist/test/collections/GlobalCollection.js +12 -0
  412. package/dist/test/collections/GlobalCollection.js.map +1 -0
  413. package/dist/test/collections/LinkCollection.js +12 -0
  414. package/dist/test/collections/LinkCollection.js.map +1 -0
  415. package/dist/test/collections/MenuCollection.js +12 -0
  416. package/dist/test/collections/MenuCollection.js.map +1 -0
  417. package/dist/test/collections/PageCollection.js +12 -0
  418. package/dist/test/collections/PageCollection.js.map +1 -0
  419. package/dist/test/collections/RoleCollection.js +19 -0
  420. package/dist/test/collections/RoleCollection.js.map +1 -0
  421. package/dist/test/collections/RoleFieldCollection.js +40 -0
  422. package/dist/test/collections/RoleFieldCollection.js.map +1 -0
  423. package/dist/test/collections/StaticCollection.js +56 -0
  424. package/dist/test/collections/StaticCollection.js.map +1 -0
  425. package/dist/test/collections/StorePageCollection.js +12 -0
  426. package/dist/test/collections/StorePageCollection.js.map +1 -0
  427. package/dist/test/collections/TenantCollection.js +22 -0
  428. package/dist/test/collections/TenantCollection.js.map +1 -0
  429. package/dist/test/collections/TranslationCollection.js +16 -0
  430. package/dist/test/collections/TranslationCollection.js.map +1 -0
  431. package/dist/test/collections/TypeACollection.js +18 -0
  432. package/dist/test/collections/TypeACollection.js.map +1 -0
  433. package/dist/test/collections/TypeBCollection.js +18 -0
  434. package/dist/test/collections/TypeBCollection.js.map +1 -0
  435. package/dist/test/collections/actions/NewsletterAction.js +29 -0
  436. package/dist/test/collections/actions/NewsletterAction.js.map +1 -0
  437. package/dist/test/collections/actions/RegisterAction.js +44 -0
  438. package/dist/test/collections/actions/RegisterAction.js.map +1 -0
  439. package/dist/test/collections/users/EndUsers.js +40 -0
  440. package/dist/test/collections/users/EndUsers.js.map +1 -0
  441. package/dist/test/collections/users/Users.js +20 -0
  442. package/dist/test/collections/users/Users.js.map +1 -0
  443. package/dist/test/index.js +32 -0
  444. package/dist/test/index.js.map +1 -0
  445. package/dist/test/payload.config.js +106 -0
  446. package/dist/test/payload.config.js.map +1 -0
  447. package/dist/test/utils.js +52 -0
  448. package/dist/test/utils.js.map +1 -0
  449. package/dist/translations.js +467 -0
  450. package/dist/translations.js.map +1 -0
  451. package/dist/types.js +31 -0
  452. package/dist/types.js.map +1 -0
  453. package/package.json +119 -37
  454. package/scss/styles.scss +0 -1
  455. package/dist/index.css +0 -796
@@ -0,0 +1,83 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { ConfirmationModal, Modal, useAuth, useModal, useTranslation } from '@payloadcms/ui';
4
+ import React, { useCallback } from 'react';
5
+ import { usePreventLeave } from './usePreventLeave';
6
+ // import './LeaveWithoutSaving.scss';
7
+ export const modalSlug = 'leave-without-saving';
8
+ export const LeaveWithoutSavingModal = (props)=>{
9
+ const { onConfirm, onCancel } = props;
10
+ const { t } = useTranslation();
11
+ return /*#__PURE__*/ _jsx(ConfirmationModal, {
12
+ body: t('general:changesNotSaved'),
13
+ cancelLabel: t('general:stayOnThisPage'),
14
+ confirmLabel: t('general:leaveAnyway'),
15
+ heading: t('general:leaveWithoutSaving'),
16
+ modalSlug: modalSlug,
17
+ onCancel: onCancel,
18
+ onConfirm: onConfirm
19
+ });
20
+ };
21
+ export const LeaveModal = (props)=>{
22
+ const { visible } = props;
23
+ const { openModal, isModalOpen, closeModal } = useModal();
24
+ const onConfirm = ()=>{
25
+ closeModal(modalSlug);
26
+ };
27
+ const onCancel = ()=>{
28
+ closeModal(modalSlug);
29
+ };
30
+ return /*#__PURE__*/ _jsx(Modal, {
31
+ slug: modalSlug,
32
+ className: `${modalSlug}__modal`,
33
+ children: visible && /*#__PURE__*/ _jsx(LeaveWithoutSavingModal, {
34
+ onConfirm: onConfirm,
35
+ onCancel: onCancel
36
+ })
37
+ });
38
+ };
39
+ const LeaveWithoutSaving = (props)=>{
40
+ const { modified } = props;
41
+ const { closeModal, openModal } = useModal();
42
+ const { user } = useAuth();
43
+ const [hasAccepted, setHasAccepted] = React.useState(false);
44
+ const { t } = useTranslation();
45
+ // const { isValid } = useForm();
46
+ const prevent = Boolean(modified && user); // Boolean((modified || !isValid) && user);
47
+ const onPrevent = useCallback(()=>{
48
+ openModal(modalSlug);
49
+ }, [
50
+ openModal
51
+ ]);
52
+ const handleAccept = useCallback(()=>{
53
+ closeModal(modalSlug);
54
+ }, [
55
+ closeModal
56
+ ]);
57
+ usePreventLeave({
58
+ hasAccepted,
59
+ onAccept: handleAccept,
60
+ onPrevent,
61
+ prevent
62
+ });
63
+ const onCancel = useCallback(()=>{
64
+ closeModal(modalSlug);
65
+ }, [
66
+ closeModal
67
+ ]);
68
+ const onConfirm = useCallback(()=>{
69
+ setHasAccepted(true);
70
+ }, []);
71
+ return /*#__PURE__*/ _jsx(ConfirmationModal, {
72
+ body: t('general:changesNotSaved'),
73
+ cancelLabel: t('general:stayOnThisPage'),
74
+ confirmLabel: t('general:leaveAnyway'),
75
+ heading: t('general:leaveWithoutSaving'),
76
+ modalSlug: modalSlug,
77
+ onCancel: onCancel,
78
+ onConfirm: onConfirm
79
+ });
80
+ };
81
+ export default LeaveWithoutSaving;
82
+
83
+ //# sourceMappingURL=LeaveWithoutSaving.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/LeaveWithoutSaving/LeaveWithoutSaving.tsx"],"sourcesContent":["'use client';\r\n\r\nimport { ConfirmationModal, Modal, OnCancel, useAuth, useModal, useTranslation } from '@payloadcms/ui';\r\nimport React, { useCallback } from 'react';\r\nimport { usePreventLeave } from './usePreventLeave';\r\n// import './LeaveWithoutSaving.scss';\r\n\r\nexport const modalSlug = 'leave-without-saving';\r\n\r\nexport type LeaveWithoutSavingModalProps = {\r\n onConfirm: () => void;\r\n onCancel: () => void;\r\n};\r\n\r\nexport const LeaveWithoutSavingModal: React.FC<LeaveWithoutSavingModalProps> = (props: LeaveWithoutSavingModalProps) => {\r\n const { onConfirm, onCancel } = props;\r\n const { t } = useTranslation();\r\n return (\r\n <ConfirmationModal\r\n body={t('general:changesNotSaved')}\r\n cancelLabel={t('general:stayOnThisPage')}\r\n confirmLabel={t('general:leaveAnyway')}\r\n heading={t('general:leaveWithoutSaving')}\r\n modalSlug={modalSlug}\r\n onCancel={onCancel}\r\n onConfirm={onConfirm}\r\n />\r\n );\r\n};\r\n\r\nexport const LeaveModal = (props: { visible: boolean }) => {\r\n const { visible } = props;\r\n\r\n const { openModal, isModalOpen, closeModal } = useModal();\r\n\r\n const onConfirm = () => {\r\n closeModal(modalSlug);\r\n };\r\n\r\n const onCancel = () => {\r\n closeModal(modalSlug);\r\n };\r\n\r\n return (\r\n <Modal slug={modalSlug} className={`${modalSlug}__modal`}>\r\n {visible && (\r\n <LeaveWithoutSavingModal onConfirm={onConfirm} onCancel={onCancel} />\r\n )}\r\n </Modal>\r\n );\r\n};\r\n\r\nconst LeaveWithoutSaving: React.FC<{ modified: boolean }> = (props: { modified: boolean }) => {\r\n const { modified } = props;\r\n const { closeModal, openModal } = useModal();\r\n const { user } = useAuth();\r\n const [hasAccepted, setHasAccepted] = React.useState(false);\r\n const { t } = useTranslation();\r\n\r\n // const { isValid } = useForm();\r\n const prevent = Boolean(modified && user); // Boolean((modified || !isValid) && user);\r\n\r\n const onPrevent = useCallback(() => {\r\n openModal(modalSlug);\r\n }, [openModal]);\r\n\r\n const handleAccept = useCallback(() => {\r\n closeModal(modalSlug);\r\n }, [closeModal]);\r\n\r\n usePreventLeave({ hasAccepted, onAccept: handleAccept, onPrevent, prevent });\r\n\r\n const onCancel: OnCancel = useCallback(() => {\r\n closeModal(modalSlug);\r\n }, [closeModal]);\r\n\r\n const onConfirm = useCallback(() => {\r\n setHasAccepted(true);\r\n }, []);\r\n\r\n return (\r\n <ConfirmationModal\r\n body={t('general:changesNotSaved')}\r\n cancelLabel={t('general:stayOnThisPage')}\r\n confirmLabel={t('general:leaveAnyway')}\r\n heading={t('general:leaveWithoutSaving')}\r\n modalSlug={modalSlug}\r\n onCancel={onCancel}\r\n onConfirm={onConfirm}\r\n />\r\n );\r\n};\r\n\r\nexport default LeaveWithoutSaving;\r\n"],"names":["ConfirmationModal","Modal","useAuth","useModal","useTranslation","React","useCallback","usePreventLeave","modalSlug","LeaveWithoutSavingModal","props","onConfirm","onCancel","t","body","cancelLabel","confirmLabel","heading","LeaveModal","visible","openModal","isModalOpen","closeModal","slug","className","LeaveWithoutSaving","modified","user","hasAccepted","setHasAccepted","useState","prevent","Boolean","onPrevent","handleAccept","onAccept"],"mappings":"AAAA;;AAEA,SAASA,iBAAiB,EAAEC,KAAK,EAAYC,OAAO,EAAEC,QAAQ,EAAEC,cAAc,QAAQ,iBAAiB;AACvG,OAAOC,SAASC,WAAW,QAAQ,QAAQ;AAC3C,SAASC,eAAe,QAAQ,oBAAoB;AACpD,sCAAsC;AAEtC,OAAO,MAAMC,YAAY,uBAAuB;AAOhD,OAAO,MAAMC,0BAAkE,CAACC;IAC9E,MAAM,EAAEC,SAAS,EAAEC,QAAQ,EAAE,GAAGF;IAChC,MAAM,EAAEG,CAAC,EAAE,GAAGT;IACd,qBACE,KAACJ;QACCc,MAAMD,EAAE;QACRE,aAAaF,EAAE;QACfG,cAAcH,EAAE;QAChBI,SAASJ,EAAE;QACXL,WAAWA;QACXI,UAAUA;QACVD,WAAWA;;AAGjB,EAAE;AAEF,OAAO,MAAMO,aAAa,CAACR;IACzB,MAAM,EAAES,OAAO,EAAE,GAAGT;IAEpB,MAAM,EAAEU,SAAS,EAAEC,WAAW,EAAEC,UAAU,EAAE,GAAGnB;IAE/C,MAAMQ,YAAY;QAChBW,WAAWd;IACb;IAEA,MAAMI,WAAW;QACfU,WAAWd;IACb;IAEA,qBACE,KAACP;QAAMsB,MAAMf;QAAWgB,WAAW,CAAC,EAAEhB,UAAU,OAAO,CAAC;kBACrDW,yBACC,KAACV;YAAwBE,WAAWA;YAAWC,UAAUA;;;AAIjE,EAAE;AAEF,MAAMa,qBAAsD,CAACf;IAC3D,MAAM,EAAEgB,QAAQ,EAAE,GAAGhB;IACrB,MAAM,EAAEY,UAAU,EAAEF,SAAS,EAAE,GAAGjB;IAClC,MAAM,EAAEwB,IAAI,EAAE,GAAGzB;IACjB,MAAM,CAAC0B,aAAaC,eAAe,GAAGxB,MAAMyB,QAAQ,CAAC;IACrD,MAAM,EAAEjB,CAAC,EAAE,GAAGT;IAEd,iCAAiC;IACjC,MAAM2B,UAAUC,QAAQN,YAAYC,OAAO,2CAA2C;IAEtF,MAAMM,YAAY3B,YAAY;QAC5Bc,UAAUZ;IACZ,GAAG;QAACY;KAAU;IAEd,MAAMc,eAAe5B,YAAY;QAC/BgB,WAAWd;IACb,GAAG;QAACc;KAAW;IAEff,gBAAgB;QAAEqB;QAAaO,UAAUD;QAAcD;QAAWF;IAAQ;IAE1E,MAAMnB,WAAqBN,YAAY;QACrCgB,WAAWd;IACb,GAAG;QAACc;KAAW;IAEf,MAAMX,YAAYL,YAAY;QAC5BuB,eAAe;IACjB,GAAG,EAAE;IAEL,qBACE,KAAC7B;QACCc,MAAMD,EAAE;QACRE,aAAaF,EAAE;QACfG,cAAcH,EAAE;QAChBI,SAASJ,EAAE;QACXL,WAAWA;QACXI,UAAUA;QACVD,WAAWA;;AAGjB;AAEA,eAAec,mBAAmB"}
@@ -0,0 +1,46 @@
1
+ @use "sass:math";
2
+
3
+ @mixin blur-bg($color: var(--theme-bg), $opacity: 0.75) {
4
+
5
+ &:before,
6
+ &:after {
7
+ content: ' ';
8
+ position: absolute;
9
+ top: 0;
10
+ right: 0;
11
+ bottom: 0;
12
+ left: 0;
13
+ }
14
+
15
+ &:before {
16
+ background: $color;
17
+ opacity: $opacity;
18
+ }
19
+
20
+ &:after {
21
+ backdrop-filter: blur(8px);
22
+ }
23
+ }
24
+
25
+ @mixin blur-bg-light {
26
+ @include blur-bg(var(--theme-bg), 0.3);
27
+ }
28
+
29
+ .leave-without-saving {
30
+ @include blur-bg;
31
+ position: fixed;
32
+ z-index: calc(var(--z-modal) + 1);
33
+ top: 0;
34
+ right: 0;
35
+ bottom: 0;
36
+ left: 0;
37
+
38
+ &__template {
39
+ position: relative;
40
+ z-index: 1;
41
+ }
42
+
43
+ .btn {
44
+ margin-right: var(--base);
45
+ }
46
+ }
@@ -0,0 +1,119 @@
1
+ 'use client';
2
+ import { useRouteTransition } from '@payloadcms/ui';
3
+ import { useRouter } from 'next/navigation';
4
+ import { useCallback, useEffect, useRef } from 'react';
5
+ function on(obj, ...args) {
6
+ if (obj && obj.addEventListener) {
7
+ obj.addEventListener(...args);
8
+ }
9
+ }
10
+ function off(obj, ...args) {
11
+ if (obj && obj.removeEventListener) {
12
+ obj.removeEventListener(...args);
13
+ }
14
+ }
15
+ export const useBeforeUnload = (enabled = true, message)=>{
16
+ const handler = useCallback((event)=>{
17
+ const finalEnabled = typeof enabled === 'function' ? enabled() : true;
18
+ if (!finalEnabled) {
19
+ return;
20
+ }
21
+ event.preventDefault();
22
+ if (message) {
23
+ event.returnValue = message;
24
+ }
25
+ return message;
26
+ }, [
27
+ enabled,
28
+ message
29
+ ]);
30
+ useEffect(()=>{
31
+ if (!enabled) {
32
+ return;
33
+ }
34
+ on(window, 'beforeunload', handler);
35
+ return ()=>off(window, 'beforeunload', handler);
36
+ }, [
37
+ enabled,
38
+ handler
39
+ ]);
40
+ };
41
+ export const usePreventLeave = ({ hasAccepted = false, message = 'Are you sure want to leave this page?', onAccept, onPrevent, prevent = true })=>{
42
+ // check when page is about to be reloaded
43
+ useBeforeUnload(prevent, message);
44
+ const { startRouteTransition } = useRouteTransition();
45
+ const router = useRouter();
46
+ const cancelledURL = useRef('');
47
+ // check when page is about to be changed
48
+ useEffect(()=>{
49
+ function isAnchorOfCurrentUrl(currentUrl, newUrl) {
50
+ const currentUrlObj = new URL(currentUrl);
51
+ const newUrlObj = new URL(newUrl);
52
+ // Compare hostname, pathname, and search parameters
53
+ if (currentUrlObj.hostname === newUrlObj.hostname && currentUrlObj.pathname === newUrlObj.pathname && currentUrlObj.search === newUrlObj.search) {
54
+ // Check if the new URL is just an anchor of the current URL page
55
+ const currentHash = currentUrlObj.hash;
56
+ const newHash = newUrlObj.hash;
57
+ return currentHash !== newHash && currentUrlObj.href.replace(currentHash, '') === newUrlObj.href.replace(newHash, '');
58
+ }
59
+ return false;
60
+ }
61
+ function findClosestAnchor(element) {
62
+ while(element && element.tagName.toLowerCase() !== 'a'){
63
+ element = element.parentElement;
64
+ }
65
+ return element;
66
+ }
67
+ function handleClick(event) {
68
+ try {
69
+ const target = event.target;
70
+ const anchor = findClosestAnchor(target);
71
+ if (anchor) {
72
+ const currentUrl = window.location.href;
73
+ const newUrl = anchor.href;
74
+ const isAnchor = isAnchorOfCurrentUrl(currentUrl, newUrl);
75
+ const isDownloadLink = anchor.download !== '';
76
+ const isNewTab = anchor.target === '_blank' || event.metaKey || event.ctrlKey;
77
+ const isPageLeaving = !(newUrl === currentUrl || isAnchor || isDownloadLink || isNewTab);
78
+ if (isPageLeaving && prevent && (!onPrevent ? !window.confirm(message) : true)) {
79
+ // Keep a reference of the href
80
+ cancelledURL.current = newUrl;
81
+ // Cancel the route change
82
+ event.preventDefault();
83
+ event.stopPropagation();
84
+ if (typeof onPrevent === 'function') {
85
+ onPrevent();
86
+ }
87
+ }
88
+ }
89
+ } catch (err) {
90
+ alert(err);
91
+ }
92
+ }
93
+ // Add the global click event listener
94
+ document.addEventListener('click', handleClick, true);
95
+ // Clean up the global click event listener when the component is unmounted
96
+ return ()=>{
97
+ document.removeEventListener('click', handleClick, true);
98
+ };
99
+ }, [
100
+ onPrevent,
101
+ prevent,
102
+ message
103
+ ]);
104
+ useEffect(()=>{
105
+ if (hasAccepted && cancelledURL.current) {
106
+ if (onAccept) {
107
+ onAccept();
108
+ }
109
+ startRouteTransition(()=>router.push(cancelledURL.current));
110
+ }
111
+ }, [
112
+ hasAccepted,
113
+ onAccept,
114
+ router,
115
+ startRouteTransition
116
+ ]);
117
+ };
118
+
119
+ //# sourceMappingURL=usePreventLeave.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/LeaveWithoutSaving/usePreventLeave.ts"],"sourcesContent":["'use client';\r\n\r\nimport { useRouteTransition } from '@payloadcms/ui';\r\nimport { useRouter } from 'next/navigation';\r\nimport { useCallback, useEffect, useRef } from 'react';\r\n\r\nfunction on<T extends Document | EventTarget | HTMLElement | Window>(\r\n obj: null | T,\r\n ...args: [string, (() => void) | null, ...any] | Parameters<T['addEventListener']>\r\n): void {\r\n if (obj && obj.addEventListener) {\r\n obj.addEventListener(...(args as Parameters<HTMLElement['addEventListener']>));\r\n }\r\n}\r\n\r\nfunction off<T extends Document | EventTarget | HTMLElement | Window>(\r\n obj: null | T,\r\n ...args: [string, (() => void) | null, ...any] | Parameters<T['removeEventListener']>\r\n): void {\r\n if (obj && obj.removeEventListener) {\r\n obj.removeEventListener(...(args as Parameters<HTMLElement['removeEventListener']>));\r\n }\r\n}\r\n\r\nexport const useBeforeUnload = (enabled: (() => boolean) | boolean = true, message?: string) => {\r\n const handler = useCallback(\r\n (event: BeforeUnloadEvent) => {\r\n const finalEnabled = typeof enabled === 'function' ? enabled() : true;\r\n\r\n if (!finalEnabled) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n\r\n if (message) {\r\n event.returnValue = message;\r\n }\r\n\r\n return message;\r\n },\r\n [enabled, message]\r\n );\r\n\r\n useEffect(() => {\r\n if (!enabled) {\r\n return;\r\n }\r\n\r\n on(window, 'beforeunload', handler);\r\n\r\n return () => off(window, 'beforeunload', handler);\r\n }, [enabled, handler]);\r\n};\r\n\r\nexport const usePreventLeave = ({\r\n hasAccepted = false,\r\n message = 'Are you sure want to leave this page?',\r\n onAccept,\r\n onPrevent,\r\n prevent = true,\r\n}: {\r\n hasAccepted: boolean;\r\n // if no `onPrevent` is provided, the message will be displayed in a confirm dialog\r\n message?: string;\r\n onAccept?: () => void;\r\n // to use a custom confirmation dialog, provide a function that returns a boolean\r\n onPrevent?: () => void;\r\n prevent: boolean;\r\n}) => {\r\n // check when page is about to be reloaded\r\n useBeforeUnload(prevent, message);\r\n const { startRouteTransition } = useRouteTransition();\r\n\r\n const router = useRouter();\r\n const cancelledURL = useRef<string>('');\r\n\r\n // check when page is about to be changed\r\n useEffect(() => {\r\n function isAnchorOfCurrentUrl(currentUrl: string, newUrl: string) {\r\n const currentUrlObj = new URL(currentUrl);\r\n const newUrlObj = new URL(newUrl);\r\n // Compare hostname, pathname, and search parameters\r\n if (\r\n currentUrlObj.hostname === newUrlObj.hostname &&\r\n currentUrlObj.pathname === newUrlObj.pathname &&\r\n currentUrlObj.search === newUrlObj.search\r\n ) {\r\n // Check if the new URL is just an anchor of the current URL page\r\n const currentHash = currentUrlObj.hash;\r\n const newHash = newUrlObj.hash;\r\n return (\r\n currentHash !== newHash &&\r\n currentUrlObj.href.replace(currentHash, '') === newUrlObj.href.replace(newHash, '')\r\n );\r\n }\r\n return false;\r\n }\r\n\r\n function findClosestAnchor(element: HTMLElement | null): HTMLAnchorElement | null {\r\n while (element && element.tagName.toLowerCase() !== 'a') {\r\n element = element.parentElement;\r\n }\r\n return element as HTMLAnchorElement;\r\n }\r\n\r\n function handleClick(event: MouseEvent) {\r\n try {\r\n const target = event.target as HTMLElement;\r\n const anchor = findClosestAnchor(target);\r\n if (anchor) {\r\n const currentUrl = window.location.href;\r\n const newUrl = anchor.href;\r\n const isAnchor = isAnchorOfCurrentUrl(currentUrl, newUrl);\r\n const isDownloadLink = anchor.download !== '';\r\n const isNewTab = anchor.target === '_blank' || event.metaKey || event.ctrlKey;\r\n\r\n const isPageLeaving = !(newUrl === currentUrl || isAnchor || isDownloadLink || isNewTab);\r\n\r\n if (isPageLeaving && prevent && (!onPrevent ? !window.confirm(message) : true)) {\r\n // Keep a reference of the href\r\n cancelledURL.current = newUrl;\r\n\r\n // Cancel the route change\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n if (typeof onPrevent === 'function') {\r\n onPrevent();\r\n }\r\n }\r\n }\r\n } catch (err) {\r\n alert(err);\r\n }\r\n }\r\n\r\n // Add the global click event listener\r\n document.addEventListener('click', handleClick, true);\r\n\r\n // Clean up the global click event listener when the component is unmounted\r\n return () => {\r\n document.removeEventListener('click', handleClick, true);\r\n };\r\n }, [onPrevent, prevent, message]);\r\n\r\n useEffect(() => {\r\n if (hasAccepted && cancelledURL.current) {\r\n if (onAccept) {\r\n onAccept();\r\n }\r\n startRouteTransition(() => router.push(cancelledURL.current));\r\n }\r\n }, [hasAccepted, onAccept, router, startRouteTransition]);\r\n};\r\n"],"names":["useRouteTransition","useRouter","useCallback","useEffect","useRef","on","obj","args","addEventListener","off","removeEventListener","useBeforeUnload","enabled","message","handler","event","finalEnabled","preventDefault","returnValue","window","usePreventLeave","hasAccepted","onAccept","onPrevent","prevent","startRouteTransition","router","cancelledURL","isAnchorOfCurrentUrl","currentUrl","newUrl","currentUrlObj","URL","newUrlObj","hostname","pathname","search","currentHash","hash","newHash","href","replace","findClosestAnchor","element","tagName","toLowerCase","parentElement","handleClick","target","anchor","location","isAnchor","isDownloadLink","download","isNewTab","metaKey","ctrlKey","isPageLeaving","confirm","current","stopPropagation","err","alert","document","push"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { useTranslation } from '@payloadcms/ui';
4
+ export const LocalizedDescriptionClient = (props)=>{
5
+ const { t } = useTranslation();
6
+ const description = props.description;
7
+ const localizedDescription = t(`description:${description}`);
8
+ /*
9
+ console.log('LocalizedDescriptionServer', description, `description:${description}`, localizedDescription);
10
+ */ return /*#__PURE__*/ _jsx("div", {
11
+ children: localizedDescription
12
+ });
13
+ };
14
+
15
+ //# sourceMappingURL=LocalizedDescriptionClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/LocalizedDescription/LocalizedDescriptionClient.tsx"],"sourcesContent":["'use client';\r\n\r\nimport { useTranslation } from '@payloadcms/ui';\r\nimport type { ViewDescriptionClientProps } from 'payload';\r\n\r\nexport const LocalizedDescriptionClient: React.FC<ViewDescriptionClientProps> = (props) => {\r\n const { t } = useTranslation<any, any>();\r\n const description = props.description;\r\n const localizedDescription = t(`description:${description}`);\r\n /*\r\n console.log('LocalizedDescriptionServer', description, `description:${description}`, localizedDescription);\r\n */\r\n return (\r\n <div>{localizedDescription}</div>\r\n );\r\n};\r\n"],"names":["useTranslation","LocalizedDescriptionClient","props","t","description","localizedDescription","div"],"mappings":"AAAA;;AAEA,SAASA,cAAc,QAAQ,iBAAiB;AAGhD,OAAO,MAAMC,6BAAmE,CAACC;IAC/E,MAAM,EAAEC,CAAC,EAAE,GAAGH;IACd,MAAMI,cAAcF,MAAME,WAAW;IACrC,MAAMC,uBAAuBF,EAAE,CAAC,YAAY,EAAEC,YAAY,CAAC;IAC3D;;EAEA,GACA,qBACE,KAACE;kBAAKD;;AAEV,EAAE"}
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ export const LocalizedDescriptionServer = (props)=>{
3
+ const i18n = props.i18n;
4
+ const description = props.description;
5
+ const localizedDescription = i18n.t(`description:${description}`);
6
+ /*
7
+ console.log('LocalizedDescriptionServer', description, `description:${description}`, localizedDescription);
8
+ */ return /*#__PURE__*/ _jsx("div", {
9
+ children: localizedDescription
10
+ });
11
+ };
12
+
13
+ //# sourceMappingURL=LocalizedDescriptionServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/LocalizedDescription/LocalizedDescriptionServer.tsx"],"sourcesContent":["import type { ViewDescriptionServerProps } from 'payload';\r\n\r\nexport const LocalizedDescriptionServer: React.FC<ViewDescriptionServerProps> = (props) => {\r\n const i18n = props.i18n;\r\n const description = props.description;\r\n const localizedDescription = i18n.t(`description:${description}` as any);\r\n /*\r\n console.log('LocalizedDescriptionServer', description, `description:${description}`, localizedDescription);\r\n */\r\n return (\r\n <div>{localizedDescription}</div>\r\n );\r\n};\r\n"],"names":["LocalizedDescriptionServer","props","i18n","description","localizedDescription","t","div"],"mappings":";AAEA,OAAO,MAAMA,6BAAmE,CAACC;IAC/E,MAAMC,OAAOD,MAAMC,IAAI;IACvB,MAAMC,cAAcF,MAAME,WAAW;IACrC,MAAMC,uBAAuBF,KAAKG,CAAC,CAAC,CAAC,YAAY,EAAEF,YAAY,CAAC;IAChE;;EAEA,GACA,qBACE,KAACG;kBAAKF;;AAEV,EAAE"}
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import './LogoServer.scss';
4
+ export const LOGO = 'data:image/svg+xml,%3C%3Fxml version=\'1.0\' encoding=\'utf-8\'%3F%3E%3Csvg version=\'1.1\' xmlns=\'http://www.w3.org/2000/svg\' xmlns:xlink=\'http://www.w3.org/1999/xlink\' x=\'0px\' y=\'0px\' viewBox=\'0 0 128 128\' style=\'enable-background:new 0 0 128 128;\' xml:space=\'preserve\'%0A%3E%3Cstyle type=\'text/css\'%3E .st0%7Bfill:url(%23SVGID_1_);%7D .st1%7Bfill:url(%23SVGID_00000007424893587046585090000002316368835338354857_);%7D%0A%3C/style%3E%3ClinearGradient id=\'SVGID_1_\' gradientUnits=\'userSpaceOnUse\' x1=\'-1.1036\' y1=\'7.6661\' x2=\'119.6941\' y2=\'124.8351\'%3E%3Cstop offset=\'0\' style=\'stop-color:%230099F7\'/%3E%3Cstop offset=\'0.1478\' style=\'stop-color:%2303A4DB\'/%3E%3Cstop offset=\'0.4675\' style=\'stop-color:%230ABF94\'/%3E%3Cstop offset=\'0.9313\' style=\'stop-color:%2315EA23\'/%3E%3Cstop offset=\'1\' style=\'stop-color:%2317F112\'/%3E%3C/linearGradient%3E%3Cpath class=\'st0\' d=\'M111,43.5c-6.4-3.7-15.2-6.4-25.6-8c-3.3-0.5-6.3,1.8-6.8,5s1.8,6.3,5,6.8c9,1.4,16.4,3.7,21.5,6.6 c4.4,2.5,6.7,5.3,6.7,8.2c0,2.2-4.4,4.8-11.2,6.7c-8.6,2.3-21.1,3.5-36.4,3.5c-15.6,0-27.9-1.1-36.4-3.3c-5.3-1.4-8-2.9-9.4-3.9 c-1.7-1.3-1.9-2.3-1.9-2.7c0,0,0-0.1,0-0.1c0-2.9,2.2-5.7,6.7-8.2c5.1-2.9,12.5-5.2,21.5-6.6c3.3-0.5,5.5-3.6,5-6.8s-3.6-5.5-6.8-5 c-10.4,1.6-19.3,4.4-25.6,8C6.6,49.6,4.4,57,4.4,62.1c0,8,1.6,15.9,4.7,23.2c3,7.1,7.3,13.5,12.8,19c5.5,5.5,11.9,9.8,19,12.8 c7.3,3.1,15.1,4.7,23.2,4.7s15.8-1.6,23.2-4.7c7.1-3,13.5-7.3,18.9-12.8s9.8-11.8,12.8-19c3.1-7.3,4.7-15.2,4.7-23.2 C123.6,57,121.4,49.6,111,43.5z M64,109.8c-20.3,0-37.7-12.8-44.5-30.8c1.6,0.6,3.3,1.1,5.1,1.6c9.5,2.5,22.8,3.7,39.4,3.7 c16.5,0,29.8-1.3,39.4-3.8c1.9-0.5,3.6-1,5.2-1.6C101.9,96.8,84.4,109.8,64,109.8z\'/%3E%3ClinearGradient id=\'SVGID_00000038373212010278178410000002552384216750816146_\' gradientUnits=\'userSpaceOnUse\' x1=\'40.599\' y1=\'-5.6707\' x2=\'157.3713\' y2=\'119.6983\'%3E%3Cstop offset=\'0\' style=\'stop-color:%230099F7\'/%3E%3Cstop offset=\'0.1478\' style=\'stop-color:%2303A4DB\'/%3E%3Cstop offset=\'0.4675\' style=\'stop-color:%230ABF94\'/%3E%3Cstop offset=\'0.9313\' style=\'stop-color:%2315EA23\'/%3E%3Cstop offset=\'1\' style=\'stop-color:%2317F112\'/%3E%3C/linearGradient%3E%3Ccircle style=\'fill:url(%23SVGID_00000038373212010278178410000002552384216750816146_);\' cx=\'64\' cy=\'19.5\' r=\'11.2\'/%3E%3C/svg%3E%0A';
5
+ export const LogoServer = ()=>{
6
+ return /*#__PURE__*/ _jsxs("div", {
7
+ className: "logo",
8
+ children: [
9
+ /*#__PURE__*/ _jsx("img", {
10
+ src: LOGO,
11
+ alt: "Bowl Logo"
12
+ }),
13
+ false && /*#__PURE__*/ _jsx("h1", {
14
+ children: "Bowl"
15
+ })
16
+ ]
17
+ });
18
+ };
19
+
20
+ //# sourceMappingURL=LogoServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/LogoServer/LogoServer.tsx"],"sourcesContent":["import React from 'react';\r\nimport './LogoServer.scss';\r\n\r\nexport const LOGO = 'data:image/svg+xml,%3C%3Fxml version=\\'1.0\\' encoding=\\'utf-8\\'%3F%3E%3Csvg version=\\'1.1\\' xmlns=\\'http://www.w3.org/2000/svg\\' xmlns:xlink=\\'http://www.w3.org/1999/xlink\\' x=\\'0px\\' y=\\'0px\\' viewBox=\\'0 0 128 128\\' style=\\'enable-background:new 0 0 128 128;\\' xml:space=\\'preserve\\'%0A%3E%3Cstyle type=\\'text/css\\'%3E .st0%7Bfill:url(%23SVGID_1_);%7D .st1%7Bfill:url(%23SVGID_00000007424893587046585090000002316368835338354857_);%7D%0A%3C/style%3E%3ClinearGradient id=\\'SVGID_1_\\' gradientUnits=\\'userSpaceOnUse\\' x1=\\'-1.1036\\' y1=\\'7.6661\\' x2=\\'119.6941\\' y2=\\'124.8351\\'%3E%3Cstop offset=\\'0\\' style=\\'stop-color:%230099F7\\'/%3E%3Cstop offset=\\'0.1478\\' style=\\'stop-color:%2303A4DB\\'/%3E%3Cstop offset=\\'0.4675\\' style=\\'stop-color:%230ABF94\\'/%3E%3Cstop offset=\\'0.9313\\' style=\\'stop-color:%2315EA23\\'/%3E%3Cstop offset=\\'1\\' style=\\'stop-color:%2317F112\\'/%3E%3C/linearGradient%3E%3Cpath class=\\'st0\\' d=\\'M111,43.5c-6.4-3.7-15.2-6.4-25.6-8c-3.3-0.5-6.3,1.8-6.8,5s1.8,6.3,5,6.8c9,1.4,16.4,3.7,21.5,6.6 c4.4,2.5,6.7,5.3,6.7,8.2c0,2.2-4.4,4.8-11.2,6.7c-8.6,2.3-21.1,3.5-36.4,3.5c-15.6,0-27.9-1.1-36.4-3.3c-5.3-1.4-8-2.9-9.4-3.9 c-1.7-1.3-1.9-2.3-1.9-2.7c0,0,0-0.1,0-0.1c0-2.9,2.2-5.7,6.7-8.2c5.1-2.9,12.5-5.2,21.5-6.6c3.3-0.5,5.5-3.6,5-6.8s-3.6-5.5-6.8-5 c-10.4,1.6-19.3,4.4-25.6,8C6.6,49.6,4.4,57,4.4,62.1c0,8,1.6,15.9,4.7,23.2c3,7.1,7.3,13.5,12.8,19c5.5,5.5,11.9,9.8,19,12.8 c7.3,3.1,15.1,4.7,23.2,4.7s15.8-1.6,23.2-4.7c7.1-3,13.5-7.3,18.9-12.8s9.8-11.8,12.8-19c3.1-7.3,4.7-15.2,4.7-23.2 C123.6,57,121.4,49.6,111,43.5z M64,109.8c-20.3,0-37.7-12.8-44.5-30.8c1.6,0.6,3.3,1.1,5.1,1.6c9.5,2.5,22.8,3.7,39.4,3.7 c16.5,0,29.8-1.3,39.4-3.8c1.9-0.5,3.6-1,5.2-1.6C101.9,96.8,84.4,109.8,64,109.8z\\'/%3E%3ClinearGradient id=\\'SVGID_00000038373212010278178410000002552384216750816146_\\' gradientUnits=\\'userSpaceOnUse\\' x1=\\'40.599\\' y1=\\'-5.6707\\' x2=\\'157.3713\\' y2=\\'119.6983\\'%3E%3Cstop offset=\\'0\\' style=\\'stop-color:%230099F7\\'/%3E%3Cstop offset=\\'0.1478\\' style=\\'stop-color:%2303A4DB\\'/%3E%3Cstop offset=\\'0.4675\\' style=\\'stop-color:%230ABF94\\'/%3E%3Cstop offset=\\'0.9313\\' style=\\'stop-color:%2315EA23\\'/%3E%3Cstop offset=\\'1\\' style=\\'stop-color:%2317F112\\'/%3E%3C/linearGradient%3E%3Ccircle style=\\'fill:url(%23SVGID_00000038373212010278178410000002552384216750816146_);\\' cx=\\'64\\' cy=\\'19.5\\' r=\\'11.2\\'/%3E%3C/svg%3E%0A';\r\n\r\nexport const LogoServer: React.FC = () => {\r\n return (\r\n <div className=\"logo\">\r\n <img src={LOGO} alt=\"Bowl Logo\" />\r\n {false && <h1>Bowl</h1>}\r\n </div>\r\n );\r\n};\r\n"],"names":["React","LOGO","LogoServer","div","className","img","src","alt","h1"],"mappings":";AAAA,OAAOA,WAAW,QAAQ;AAC1B,OAAO,oBAAoB;AAE3B,OAAO,MAAMC,OAAO,iyEAAiyE;AAErzE,OAAO,MAAMC,aAAuB;IAClC,qBACE,MAACC;QAAIC,WAAU;;0BACb,KAACC;gBAAIC,KAAKL;gBAAMM,KAAI;;YACnB,uBAAS,KAACC;0BAAG;;;;AAGpB,EAAE"}
@@ -0,0 +1,21 @@
1
+ .logo {
2
+ display: flex;
3
+ align-items: center;
4
+ gap: 1em;
5
+
6
+ img {
7
+ width: 52px;
8
+ height: 52px;
9
+ margin: auto;
10
+ }
11
+
12
+ h1 {
13
+ margin: 0;
14
+ letter-spacing: 0.1rem;
15
+ line-height: 1;
16
+ font-size: 2rem;
17
+ margin-top: 0.5rem;
18
+ font-weight: 100;
19
+ color: #5aeb79;
20
+ }
21
+ }
@@ -0,0 +1,181 @@
1
+ import { options } from '../../options';
2
+ import { roles } from '../../types';
3
+ import { isMixerRequest } from '../api';
4
+ const isUserWithRoles = (user)=>{
5
+ return user ? 'roles' in user && Array.isArray(user.roles) && user.roles.reduce((p, c)=>p && options.rolesList.includes(c), true) : false;
6
+ };
7
+ const isUserWithTenants = (user)=>{
8
+ return user ? user.collection !== undefined && 'tenants' in user && Array.isArray(user.tenants) && user.tenants.length > 0 : false;
9
+ };
10
+ // !!! temporary fix expect ClientUser also
11
+ export const hasRole = (user_, ...roles)=>{
12
+ const user = user_;
13
+ if (!isUserWithRoles(user)) {
14
+ return false;
15
+ }
16
+ // console.log('isUserWithRoles', roles, user.roles);
17
+ // return true if the user has at least one of the roles in the roles arg (or the roles arg is empty and the user has any role at all)
18
+ return roles.length === 0 ? user.roles.length > 0 : user.roles.find((x)=>roles.includes(x)) !== undefined;
19
+ };
20
+ export const isRole = (...roles)=>(args)=>{
21
+ const { req: { user } } = args;
22
+ // console.log('isRole', user?.roles);
23
+ return hasRole(user, ...roles);
24
+ };
25
+ export const isPageRole = (...roles)=>(args)=>{
26
+ const { req } = args;
27
+ const { user } = req;
28
+ if (!hasRole(user, ...roles)) {
29
+ return false;
30
+ }
31
+ if (isMixerRequest(req) && req.query?.draft !== 'true') {
32
+ return {
33
+ or: [
34
+ {
35
+ _status: {
36
+ equals: 'published'
37
+ }
38
+ },
39
+ {
40
+ _status: {
41
+ exists: false
42
+ }
43
+ }
44
+ ]
45
+ };
46
+ } else {
47
+ return true;
48
+ }
49
+ };
50
+ export const isAdmin = (args)=>{
51
+ // console.log('isAdmin', roles.Admin, args.req.user?.roles);
52
+ return isRole(roles.Admin)(args);
53
+ };
54
+ export const isSelf = (args)=>{
55
+ const { req } = args;
56
+ const user = req.user;
57
+ if (!user) {
58
+ return false;
59
+ }
60
+ if (user.collection !== options.slug.users && !hasRole(user, roles.User)) return false;
61
+ return {
62
+ id: {
63
+ equals: user.id
64
+ }
65
+ };
66
+ };
67
+ export const isOwn = (args)=>{
68
+ const { req } = args;
69
+ const user = req.user;
70
+ if (!hasRole(user, roles.User)) return false;
71
+ return {
72
+ 'user.id': {
73
+ equals: user.id
74
+ }
75
+ };
76
+ };
77
+ export const isAdminOrSelf = (args)=>{
78
+ return isAdmin(args) || isSelf(args);
79
+ };
80
+ export const isAdminOrOwn = (args)=>{
81
+ return isAdmin(args) || isOwn(args);
82
+ };
83
+ export const isTenant = (slug)=>(args)=>{
84
+ const { req } = args;
85
+ const { payload } = req;
86
+ const user = req.user;
87
+ if (!isUserWithTenants(user)) {
88
+ return false;
89
+ }
90
+ // find collections used as tenants (es: ['market', 'llmApp'])
91
+ const userCollection = payload.config.collections.find((x)=>x.slug === user.collection);
92
+ const tenantsField = (userCollection?.fields || []).find((x)=>x.type === 'relationship' && x.name === 'tenants');
93
+ const tenantCollections = [];
94
+ if (Array.isArray(tenantsField?.relationTo)) {
95
+ tenantCollections.push(...tenantsField.relationTo);
96
+ } else {
97
+ tenantCollections.push(tenantsField.relationTo);
98
+ }
99
+ const isPolymorphicRel = Array.isArray(tenantsField.relationTo);
100
+ const isTenantDoc = tenantCollections.includes(slug);
101
+ if (isTenantDoc) {
102
+ // the doc itself is a tenant, check if the user has access to it
103
+ const query = {
104
+ id: {
105
+ in: isPolymorphicRel ? user.tenants.filter((x)=>x.relationTo === slug).map((x)=>x.value?.id) : user.tenants.map((x)=>x.id)
106
+ }
107
+ };
108
+ return query;
109
+ }
110
+ // find fields in the collection that are relationships to tenants collections
111
+ const collectionConfig = payload.config.collections.find((x)=>x.slug === slug);
112
+ const fields = (collectionConfig?.fields || []).filter((field)=>field.type === 'relationship' && tenantCollections.find((x)=>field.relationTo.includes(x)) !== undefined);
113
+ if (!fields.length) {
114
+ // the doc is neither a tenant nor has any field that is a relationship to a tenant collection, the user cannot access it
115
+ return false;
116
+ }
117
+ // for each field, check if its value is in the user's tenants (or is empty)
118
+ const query = {
119
+ and: fields.map((field)=>({
120
+ or: [
121
+ {
122
+ [field.name]: {
123
+ in: isPolymorphicRel ? user.tenants.filter((x)=>x.relationTo === field.relationTo).map((x)=>x.value?.id) : user.tenants.map((x)=>x.id)
124
+ }
125
+ },
126
+ // if the doc is not restricted to any tenant, we can access it
127
+ {
128
+ [field.name]: {
129
+ exists: false
130
+ }
131
+ },
132
+ {
133
+ [field.name]: {
134
+ equals: ''
135
+ }
136
+ },
137
+ {
138
+ [field.name]: {
139
+ equals: null
140
+ }
141
+ },
142
+ {
143
+ [field.name]: {
144
+ equals: []
145
+ }
146
+ }
147
+ ]
148
+ }))
149
+ };
150
+ return query;
151
+ };
152
+ export const orAccess = (...access)=>{
153
+ return async (args)=>{
154
+ const wheres = [];
155
+ let result = false;
156
+ for (const a of access){
157
+ if (result === true) {
158
+ return result;
159
+ }
160
+ const r = await a(args);
161
+ if (typeof r === 'boolean') {
162
+ result = r;
163
+ } else {
164
+ wheres.push(r);
165
+ }
166
+ }
167
+ const l = wheres.length;
168
+ if (l === 0) {
169
+ return false;
170
+ } else if (l === 1) {
171
+ return wheres[0];
172
+ }
173
+ const where = {
174
+ or: wheres
175
+ };
176
+ // console.log('where', JSON.stringify(where));
177
+ return where;
178
+ };
179
+ };
180
+
181
+ //# sourceMappingURL=access.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/core/access/access.ts"],"sourcesContent":["import { Access, AccessArgs, ClientUser, CollectionSlug, RelationshipField, TypedUser, Where } from 'payload';\r\nimport { options } from '../../options';\r\nimport { BowlRole, roles } from '../../types';\r\nimport { isMixerRequest } from '../api';\r\n\r\ntype UserWithRoles = TypedUser & {\r\n roles: BowlRole[];\r\n};\r\n\r\ntype BowlTenant = {\r\n relationTo?: string,\r\n value?: { id: string },\r\n id?: string,\r\n};\r\n\r\ntype UserWithTenants = TypedUser & {\r\n tenants: BowlTenant[];\r\n};\r\n\r\nconst isUserWithRoles = (user?: TypedUser | null): user is UserWithRoles => {\r\n return user ? (\r\n 'roles' in user &&\r\n Array.isArray(user.roles) &&\r\n user.roles.reduce((p, c) => p && options.rolesList.includes(c), true)\r\n ) : false;\r\n};\r\n\r\nconst isUserWithTenants = (user?: TypedUser | null): user is UserWithTenants => {\r\n return user ? (\r\n user.collection !== undefined &&\r\n 'tenants' in user &&\r\n Array.isArray(user.tenants) &&\r\n user.tenants.length > 0\r\n ) : false;\r\n};\r\n\r\n// !!! temporary fix expect ClientUser also\r\nexport const hasRole = (user_?: ClientUser | TypedUser | null, ...roles: BowlRole[]): user_ is UserWithRoles => {\r\n const user = user_ as TypedUser | null;\r\n if (!isUserWithRoles(user)) {\r\n return false;\r\n }\r\n // console.log('isUserWithRoles', roles, user.roles);\r\n // return true if the user has at least one of the roles in the roles arg (or the roles arg is empty and the user has any role at all)\r\n return roles.length === 0 ? (\r\n user.roles.length > 0\r\n ) : (\r\n user.roles.find(x => roles.includes(x)) !== undefined\r\n );\r\n};\r\n\r\nexport const isRole = (...roles: BowlRole[]) => (args: AccessArgs) => {\r\n const { req: { user } } = args;\r\n // console.log('isRole', user?.roles);\r\n return hasRole(user as TypedUser, ...roles);\r\n};\r\n\r\nexport const isPageRole = (...roles: BowlRole[]) => (args: AccessArgs) => {\r\n const { req } = args;\r\n const { user } = req;\r\n if (!hasRole(user as TypedUser, ...roles)) {\r\n return false;\r\n }\r\n if (isMixerRequest(req) && req.query?.draft !== 'true') {\r\n return {\r\n or: [\r\n {\r\n _status: {\r\n equals: 'published',\r\n },\r\n },\r\n {\r\n _status: {\r\n exists: false,\r\n },\r\n },\r\n ],\r\n };\r\n } else {\r\n return true;\r\n }\r\n};\r\n\r\nexport const isAdmin = (args: AccessArgs) => {\r\n // console.log('isAdmin', roles.Admin, args.req.user?.roles);\r\n return isRole(roles.Admin)(args);\r\n};\r\n\r\nexport const isSelf = (args: AccessArgs) => {\r\n const { req } = args;\r\n const user = req.user as TypedUser;\r\n if (!user) {\r\n return false;\r\n }\r\n if (\r\n user.collection !== options.slug.users &&\r\n !hasRole(user, roles.User)\r\n ) return false;\r\n return {\r\n id: {\r\n equals: (user).id,\r\n },\r\n };\r\n};\r\n\r\nexport const isOwn = (args: AccessArgs) => {\r\n const { req } = args;\r\n const user = req.user as TypedUser;\r\n if (!hasRole(user, roles.User)) return false;\r\n return {\r\n 'user.id': {\r\n equals: user.id,\r\n },\r\n };\r\n};\r\n\r\nexport const isAdminOrSelf = (args: AccessArgs) => {\r\n return isAdmin(args) || isSelf(args);\r\n};\r\n\r\nexport const isAdminOrOwn = (args: AccessArgs) => {\r\n return isAdmin(args) || isOwn(args);\r\n};\r\n\r\nexport const isTenant = (slug: CollectionSlug) => (args: AccessArgs) => {\r\n const { req } = args;\r\n const { payload } = req;\r\n const user = req.user as TypedUser;\r\n if (!isUserWithTenants(user)) {\r\n return false;\r\n }\r\n\r\n // find collections used as tenants (es: ['market', 'llmApp'])\r\n const userCollection = payload.config.collections.find(x => x.slug === user.collection);\r\n const tenantsField = (userCollection?.fields || [])\r\n .find(x => x.type === 'relationship' && x.name === 'tenants') as RelationshipField;\r\n const tenantCollections: CollectionSlug[] = [];\r\n if (Array.isArray(tenantsField?.relationTo)) {\r\n tenantCollections.push(...tenantsField.relationTo);\r\n } else {\r\n tenantCollections.push(tenantsField.relationTo);\r\n }\r\n const isPolymorphicRel = Array.isArray(tenantsField.relationTo);\r\n\r\n const isTenantDoc = tenantCollections.includes(slug);\r\n if (isTenantDoc) {\r\n // the doc itself is a tenant, check if the user has access to it\r\n const query = {\r\n id: {\r\n in: isPolymorphicRel ? (\r\n user.tenants\r\n .filter(x => x.relationTo === slug)\r\n .map(x => x.value?.id)\r\n ) : (\r\n user.tenants.map(x => x.id)\r\n ),\r\n },\r\n };\r\n return query;\r\n }\r\n\r\n // find fields in the collection that are relationships to tenants collections\r\n const collectionConfig = payload.config.collections.find(x => x.slug === slug);\r\n const fields = (collectionConfig?.fields || []).filter(field =>\r\n field.type === 'relationship' &&\r\n tenantCollections.find(x => field.relationTo.includes(x)) !== undefined\r\n ) as RelationshipField[];\r\n\r\n if (!fields.length) {\r\n // the doc is neither a tenant nor has any field that is a relationship to a tenant collection, the user cannot access it\r\n return false;\r\n }\r\n\r\n // for each field, check if its value is in the user's tenants (or is empty)\r\n const query = {\r\n and: fields.map(field => ({\r\n or: [\r\n {\r\n [field.name]: {\r\n in: isPolymorphicRel ? (\r\n user.tenants\r\n .filter(x => x.relationTo === field.relationTo)\r\n .map(x => x.value?.id)\r\n ) : (\r\n user.tenants.map(x => x.id)\r\n ),\r\n },\r\n },\r\n // if the doc is not restricted to any tenant, we can access it\r\n {\r\n [field.name]: {\r\n exists: false,\r\n },\r\n },\r\n {\r\n [field.name]: {\r\n equals: '',\r\n },\r\n },\r\n {\r\n [field.name]: {\r\n equals: null,\r\n },\r\n },\r\n {\r\n [field.name]: {\r\n equals: [],\r\n },\r\n },\r\n ],\r\n })),\r\n };\r\n return query;\r\n};\r\n\r\nexport const orAccess = (...access: Access[]): Access => {\r\n return async (args: AccessArgs) => {\r\n const wheres: Where[] = [];\r\n let result: boolean = false;\r\n for (const a of access) {\r\n if (result === true) {\r\n return result;\r\n }\r\n const r = await a(args);\r\n if (typeof r === 'boolean') {\r\n result = r;\r\n } else {\r\n wheres.push(r);\r\n }\r\n }\r\n const l = wheres.length;\r\n if (l === 0) {\r\n return false;\r\n } else if (l === 1) {\r\n return wheres[0];\r\n }\r\n const where: Where = {\r\n or: wheres,\r\n };\r\n // console.log('where', JSON.stringify(where));\r\n return where;\r\n };\r\n};\r\n"],"names":["options","roles","isMixerRequest","isUserWithRoles","user","Array","isArray","reduce","p","c","rolesList","includes","isUserWithTenants","collection","undefined","tenants","length","hasRole","user_","find","x","isRole","args","req","isPageRole","query","draft","or","_status","equals","exists","isAdmin","Admin","isSelf","slug","users","User","id","isOwn","isAdminOrSelf","isAdminOrOwn","isTenant","payload","userCollection","config","collections","tenantsField","fields","type","name","tenantCollections","relationTo","push","isPolymorphicRel","isTenantDoc","in","filter","map","value","collectionConfig","field","and","orAccess","access","wheres","result","a","r","l","where"],"mappings":"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"}