@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,458 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { MinimalTemplate } from '@payloadcms/next/templates';
4
+ import { Button, CheckboxInput, Form, SelectInput, XIcon, toast, useAuth, useConfig, useLocale, useModal, useTranslation } from '@payloadcms/ui';
5
+ import { getRouteResolver } from '@websolutespa/payload-utils';
6
+ import * as Papa from 'papaparse';
7
+ import React, { useCallback, useEffect, useState } from 'react';
8
+ import { useDropzone } from 'react-dropzone';
9
+ import { ImportLogInvalidTypes, ImportLogType, ImportMode } from '../../core/api/types';
10
+ import './ImportModal.scss';
11
+ const INITIAL_DATA = {
12
+ importMode: ImportMode.Append,
13
+ dataParsing: false
14
+ };
15
+ const baseClass = 'import-modal';
16
+ export const ImportModal = ({ parser, slug })=>{
17
+ const { closeAllModals } = useModal();
18
+ const { config, getEntityConfig } = useConfig();
19
+ const collectionConfig = getEntityConfig({
20
+ collectionSlug: slug
21
+ });
22
+ const routeResolver = getRouteResolver(config);
23
+ const collectionUrl = routeResolver.api(`/${collectionConfig.slug}?pagination=false&depth=0`);
24
+ // !!! check translations
25
+ const { t } = useTranslation();
26
+ const format = (text, ...rest)=>{
27
+ return text.replace(/\{(\d)\}/g, (m, g)=>{
28
+ const i = parseInt(g);
29
+ return i >= 0 && i < rest.length ? String(rest[i]) : '';
30
+ });
31
+ };
32
+ const { code: locale } = useLocale();
33
+ const user = useAuth();
34
+ const [dirty, setDirty] = useState(false);
35
+ const [valid, setValid] = useState(false);
36
+ const [error, setError] = useState();
37
+ const [name, setName] = useState(null);
38
+ const [csv, setCSV] = useState(null);
39
+ const [keys, setKeys] = useState(null);
40
+ const [data, setData] = useState(null);
41
+ const [items, setItems] = useState([]);
42
+ const [logs, setLogs] = useState([]);
43
+ const [importMode, setImportMode] = useState(INITIAL_DATA.importMode);
44
+ const [dataParsing, setDataParsing] = useState(INITIAL_DATA.dataParsing);
45
+ const importModes = Object.entries(ImportMode).map(([k, v])=>({
46
+ value: v,
47
+ label: t(`importExport:mode${k}`)
48
+ }));
49
+ const onSelectDidChange = (option)=>{
50
+ // console.log('onSelectDidChange', option);
51
+ if (Array.isArray(option)) {
52
+ return;
53
+ }
54
+ if (importMode !== option.value) {
55
+ setValid(false);
56
+ setImportMode(option.value);
57
+ }
58
+ };
59
+ const onCheckboxkDidChange = (event)=>{
60
+ // console.log('onCheckboxkDidChange', value);
61
+ setValid(false);
62
+ setDataParsing(!dataParsing);
63
+ };
64
+ const validate = useCallback(async (keys, data)=>{
65
+ try {
66
+ const messageByType = (key, type)=>{
67
+ let message;
68
+ switch(type){
69
+ case ImportLogType.Required:
70
+ message = format(t('importExport:errorRequired'), key);
71
+ break;
72
+ case ImportLogType.Optional:
73
+ message = format(t('importExport:errorOptional'), key);
74
+ break;
75
+ case ImportLogType.Invalid:
76
+ message = format(t('importExport:errorInvalid'), key);
77
+ break;
78
+ case ImportLogType.Duplicate:
79
+ message = format(t('importExport:errorDuplicate'), key);
80
+ break;
81
+ case ImportLogType.Unexpected:
82
+ message = format(t('importExport:errorUnexpected'), key);
83
+ break;
84
+ }
85
+ return message;
86
+ };
87
+ const addLog = (logs, key, type, invalid)=>{
88
+ const message = messageByType(key, type);
89
+ const id = invalid ? `${key}-${type}-${invalid}` : `${key}-${type}`;
90
+ const log = once(logs, {
91
+ id,
92
+ key,
93
+ type,
94
+ message,
95
+ invalid,
96
+ count: 0
97
+ });
98
+ log.count++;
99
+ return log;
100
+ };
101
+ const itemOptionalKeys = [];
102
+ const itemKeys = keys;
103
+ // collecting model fields & keys
104
+ const fields = collectionConfig.fields.filter((x)=>'name' in x && x['name'] !== undefined && x.type !== 'ui');
105
+ const fieldKeys = fields.map((x)=>x['name']);
106
+ const requiredFields = fields.filter((x)=>{
107
+ if (x['name'] === 'id' && importMode === ImportMode.Update) {
108
+ return true;
109
+ } else {
110
+ return 'required' in x && x['required'] === true;
111
+ }
112
+ });
113
+ const uniqueFields = fields.filter((x)=>x['unique'] === true);
114
+ const requiredFieldKeys = requiredFields.map((x)=>x['name']);
115
+ const optionalFieldKeys = fieldKeys.filter((x)=>!requiredFieldKeys.includes(x));
116
+ const uniqueFieldKeys = uniqueFields.map((x)=>x['name']);
117
+ let items = [];
118
+ // parse values
119
+ const valueParsers = itemKeys.map((key)=>{
120
+ let parseValue = (item)=>item[key];
121
+ if (fieldKeys.includes(key)) {
122
+ const field = collectionConfig.fields.find((x)=>'name' in x && x['name'] === key);
123
+ if (field) {
124
+ switch(field.type){
125
+ case 'checkbox':
126
+ parseValue = (item)=>item[key] !== undefined ? Boolean(item[key]) : item[key];
127
+ break;
128
+ case 'date':
129
+ parseValue = (item)=>item[key] !== undefined ? new Date(item[key]) : item[key];
130
+ break;
131
+ case 'number':
132
+ parseValue = (item)=>item[key] !== undefined ? Number(item[key]) : item[key];
133
+ break;
134
+ }
135
+ }
136
+ }
137
+ return parseValue;
138
+ });
139
+ for (const row of data){
140
+ const item = {};
141
+ itemKeys.forEach((key, i)=>{
142
+ const parser = valueParsers[i];
143
+ if (parser) {
144
+ item[key] = parser(row);
145
+ }
146
+ });
147
+ items.push(item);
148
+ }
149
+ if (dataParsing && typeof parser === 'function') {
150
+ items = parser(items);
151
+ }
152
+ // console.log('data', data);
153
+ // console.log('items', items);
154
+ // collecting stored values
155
+ const httpResponse = await fetch(collectionUrl, {
156
+ method: 'GET',
157
+ credentials: 'include',
158
+ headers: {
159
+ 'Content-Type': 'application/json'
160
+ }
161
+ });
162
+ if (!httpResponse.ok) {
163
+ throw httpResponse;
164
+ }
165
+ const storedItems = await httpResponse.json();
166
+ // console.log('rows', rows, 'data', result.data);
167
+ // collecting logs
168
+ const logs = [];
169
+ // required fields
170
+ requiredFieldKeys.forEach((key)=>{
171
+ if (!itemKeys.includes(key) || itemOptionalKeys.includes(key)) {
172
+ addLog(logs, key, ImportLogType.Required);
173
+ }
174
+ });
175
+ // optional fields
176
+ optionalFieldKeys.forEach((key)=>{
177
+ if (!itemKeys.includes(key)) {
178
+ addLog(logs, key, ImportLogType.Optional);
179
+ }
180
+ });
181
+ // deep check values
182
+ for (const key of itemKeys){
183
+ if (fieldKeys.includes(key)) {
184
+ const field = collectionConfig.fields.find((x)=>'name' in x && x['name'] === key);
185
+ if (field) {
186
+ const validate = 'validate' in field ? field['validate'] : undefined;
187
+ const values = [];
188
+ const storedValues = uniqueFieldKeys.includes(key) ? storedItems.map((x)=>x[key]) : [];
189
+ for (const item of items){
190
+ const value = item[key];
191
+ // validate field
192
+ if (typeof validate === 'function') {
193
+ const validation = await validate(value, {
194
+ data: item,
195
+ siblingData: item,
196
+ operation: 'create',
197
+ user,
198
+ t
199
+ });
200
+ if (validation !== true) {
201
+ // console.log(key, value, validation, item);
202
+ if (logs.find((x)=>x.key === 'key' && x.type === ImportLogType.Invalid) === undefined) {
203
+ addLog(logs, key, ImportLogType.Invalid, validation);
204
+ }
205
+ }
206
+ }
207
+ // unique field
208
+ if (uniqueFieldKeys.includes(key) && (values.includes(value) || (importMode === ImportMode.Append ? storedValues.includes(value) : false))) {
209
+ addLog(logs, key, ImportLogType.Duplicate, String(value));
210
+ }
211
+ values.push(value);
212
+ }
213
+ }
214
+ } else {
215
+ addLog(logs, key, ImportLogType.Unexpected);
216
+ }
217
+ }
218
+ const sortOrder = Object.values(ImportLogType);
219
+ logs.sort((a, b)=>{
220
+ return sortOrder.indexOf(a.type) - sortOrder.indexOf(b.type);
221
+ });
222
+ setItems(items);
223
+ setLogs(logs);
224
+ const errors = logs.filter((x)=>ImportLogInvalidTypes.includes(x.type));
225
+ if (errors.length === 0) {
226
+ setValid(true);
227
+ }
228
+ // console.log(logs, items, itemKeys, itemOptionalKeys, fieldKeys, requiredFieldKeys, optionalFieldKeys);
229
+ } catch (error) {
230
+ console.log('parse error', error);
231
+ setError(error);
232
+ }
233
+ }, [
234
+ collectionUrl,
235
+ importMode,
236
+ dataParsing,
237
+ parser,
238
+ collectionConfig.fields,
239
+ t,
240
+ user
241
+ ]);
242
+ useEffect(()=>{
243
+ if (keys && data) {
244
+ validate(keys, data);
245
+ }
246
+ }, [
247
+ keys,
248
+ data,
249
+ importMode,
250
+ validate
251
+ ]);
252
+ const onDrop = useCallback((acceptedFiles)=>{
253
+ const acceptedFile = acceptedFiles.find(()=>true);
254
+ if (acceptedFile) {
255
+ const reader = new FileReader();
256
+ reader.onabort = ()=>console.log('file reading was aborted');
257
+ reader.onerror = ()=>console.log('file reading has failed');
258
+ reader.onload = ()=>{
259
+ // Do whatever you want with the file contents
260
+ const csv = reader.result;
261
+ // console.log('csv', csv);
262
+ // parsing csv to { data:[][] }
263
+ const result = Papa.parse(csv);
264
+ const resultData = result.data;
265
+ // collecting imported keys & data
266
+ let keys = [];
267
+ const data = resultData.reduce((p, c, i)=>{
268
+ if (i === 0) {
269
+ keys = c;
270
+ } else {
271
+ const item = {};
272
+ keys.forEach((key, k)=>{
273
+ if (c[k] !== undefined) {
274
+ item[key] = c[k];
275
+ }
276
+ });
277
+ p.push(item);
278
+ }
279
+ return p;
280
+ }, []);
281
+ setName(acceptedFile.name);
282
+ setCSV(csv);
283
+ setKeys(keys);
284
+ setData(data);
285
+ setDirty(true);
286
+ };
287
+ // reader.readAsArrayBuffer(file);
288
+ reader.readAsText(acceptedFile);
289
+ }
290
+ }, []);
291
+ const { getRootProps, getInputProps, isDragActive } = useDropzone({
292
+ accept: {
293
+ 'text/csv': []
294
+ },
295
+ maxSize: 1048576 * 20,
296
+ maxFiles: 1,
297
+ onDrop
298
+ });
299
+ const onSubmit = async ()=>{
300
+ // console.log('ImportModal.onSubmit');
301
+ try {
302
+ const url = routeResolver.api(`/${collectionConfig.slug}/import?locale=${locale}&mode=${importMode}`);
303
+ const httpResponse = await fetch(url, {
304
+ method: 'POST',
305
+ body: JSON.stringify({
306
+ items
307
+ }),
308
+ credentials: 'include',
309
+ headers: {
310
+ 'Content-Type': 'application/json'
311
+ }
312
+ });
313
+ if (!httpResponse.ok) {
314
+ throw httpResponse;
315
+ }
316
+ const response = await httpResponse.json();
317
+ // console.log('ImportModal.onSubmit', response);
318
+ toast.success(t('importExport:success'));
319
+ closeAllModals();
320
+ } catch (error) {
321
+ console.log('ImportModal.onSubmit.error', error);
322
+ toast.error(format(t('importExport:failure'), collectionConfig.slug));
323
+ }
324
+ };
325
+ const onClose = ()=>{
326
+ // console.log('onClose');
327
+ closeAllModals();
328
+ };
329
+ const onClear = ()=>{
330
+ // console.log('onClear');
331
+ setValid(false);
332
+ setDirty(false);
333
+ setName(null);
334
+ setCSV(null);
335
+ setKeys(null);
336
+ setData(null);
337
+ setItems([]);
338
+ setLogs([]);
339
+ };
340
+ return /*#__PURE__*/ _jsxs(MinimalTemplate, {
341
+ children: [
342
+ /*#__PURE__*/ _jsxs("header", {
343
+ className: `${baseClass}__header`,
344
+ children: [
345
+ /*#__PURE__*/ _jsx("h3", {
346
+ children: t('importExport:modalTitle')
347
+ }),
348
+ /*#__PURE__*/ _jsx(Button, {
349
+ buttonStyle: "none",
350
+ onClick: onClose,
351
+ children: /*#__PURE__*/ _jsx(XIcon, {})
352
+ })
353
+ ]
354
+ }),
355
+ /*#__PURE__*/ _jsx("main", {
356
+ className: `${baseClass}__main`,
357
+ children: /*#__PURE__*/ _jsxs(Form, {
358
+ onSubmit: onSubmit,
359
+ children: [
360
+ /*#__PURE__*/ _jsxs("div", {
361
+ className: "render-fields",
362
+ children: [
363
+ /*#__PURE__*/ _jsx(SelectInput, {
364
+ // isClearable={viewType === 'list'}
365
+ label: t('importExport:importMode'),
366
+ name: "importMode",
367
+ path: 'importMode',
368
+ options: importModes,
369
+ onChange: onSelectDidChange
370
+ }),
371
+ typeof parser === 'function' && /*#__PURE__*/ _jsx(CheckboxInput, {
372
+ label: t('importExport:enableDataParsing'),
373
+ id: "importMode",
374
+ name: "dataParsing",
375
+ onToggle: onCheckboxkDidChange
376
+ })
377
+ ]
378
+ }),
379
+ data ? /*#__PURE__*/ _jsxs(_Fragment, {
380
+ children: [
381
+ /*#__PURE__*/ _jsx("div", {
382
+ dangerouslySetInnerHTML: {
383
+ __html: format(t('importExport:records'), items.length, name)
384
+ }
385
+ }),
386
+ logs.length > 0 && /*#__PURE__*/ _jsx("ul", {
387
+ className: `${baseClass}__logs`,
388
+ children: logs.map((log, i)=>/*#__PURE__*/ _jsxs("li", {
389
+ className: `${baseClass}__log ${baseClass}__log--${log.type}`,
390
+ children: [
391
+ log.count,
392
+ " ",
393
+ log.message,
394
+ " ",
395
+ /*#__PURE__*/ _jsx("i", {
396
+ children: log.invalid
397
+ })
398
+ ]
399
+ }, `log-${i}`))
400
+ })
401
+ ]
402
+ }) : /*#__PURE__*/ _jsxs("div", {
403
+ className: `${baseClass}__dropzone`,
404
+ ...getRootProps(),
405
+ children: [
406
+ /*#__PURE__*/ _jsx("input", {
407
+ className: `${baseClass}__input`,
408
+ ...getInputProps()
409
+ }),
410
+ isDragActive ? /*#__PURE__*/ _jsx("div", {
411
+ children: t('importExport:dropTitle')
412
+ }) : /*#__PURE__*/ _jsx("div", {
413
+ children: t('importExport:dropAbstract')
414
+ })
415
+ ]
416
+ }),
417
+ error && /*#__PURE__*/ _jsxs(_Fragment, {
418
+ children: [
419
+ /*#__PURE__*/ _jsx("div", {
420
+ children: t('importExport:parseError')
421
+ }),
422
+ error.message && /*#__PURE__*/ _jsx("div", {
423
+ children: error.message
424
+ })
425
+ ]
426
+ }),
427
+ /*#__PURE__*/ _jsxs("div", {
428
+ className: `${baseClass}__foot`,
429
+ children: [
430
+ dirty && /*#__PURE__*/ _jsx(Button, {
431
+ type: "button",
432
+ buttonStyle: "secondary",
433
+ onClick: onClear,
434
+ children: t('importExport:clear')
435
+ }),
436
+ /*#__PURE__*/ _jsx(Button, {
437
+ type: "submit",
438
+ disabled: !valid,
439
+ children: t('importExport:submit')
440
+ })
441
+ ]
442
+ })
443
+ ]
444
+ })
445
+ })
446
+ ]
447
+ });
448
+ };
449
+ function once(items, item) {
450
+ const exhistingItem = items.find((x)=>x.id === item.id);
451
+ if (exhistingItem) {
452
+ return exhistingItem;
453
+ }
454
+ items.push(item);
455
+ return item;
456
+ }
457
+
458
+ //# sourceMappingURL=ImportModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/ImportExport/ImportModal.tsx"],"sourcesContent":["'use client';\r\n\r\nimport { MinimalTemplate } from '@payloadcms/next/templates';\r\nimport { Button, CheckboxInput, Form, SelectInput, XIcon, toast, useAuth, useConfig, useLocale, useModal, useTranslation } from '@payloadcms/ui';\r\nimport { IEntity, IEquatable } from '@websolutespa/bom-core';\r\nimport { getRouteResolver } from '@websolutespa/payload-utils';\r\nimport * as Papa from 'papaparse';\r\nimport type { ClientField } from 'payload';\r\nimport React, { useCallback, useEffect, useState } from 'react';\r\nimport { useDropzone } from 'react-dropzone';\r\nimport { ImportLogInvalidTypes, ImportLogType, ImportMode } from '../../core/api/types';\r\nimport './ImportModal.scss';\r\nimport { IImportItem } from './types';\r\n\r\ntype Option<TValue = unknown> = {\r\n [key: string]: unknown;\r\n id?: string;\r\n value: TValue;\r\n};\r\n\r\ntype IRow = Record<string, string>;\r\n\r\ntype ImportModalProps<T = any> = {\r\n parser?: (items: IImportItem[]) => T[];\r\n slug: string;\r\n};\r\n\r\ntype ILog = {\r\n count: number;\r\n id: IEquatable;\r\n invalid?: string;\r\n key: string;\r\n message: string;\r\n type: ImportLogType;\r\n};\r\n\r\nconst INITIAL_DATA = {\r\n importMode: ImportMode.Append,\r\n dataParsing: false,\r\n};\r\n\r\nconst baseClass = 'import-modal';\r\n\r\nexport const ImportModal: React.FC<ImportModalProps> = ({\r\n parser,\r\n slug,\r\n}) => {\r\n const { closeAllModals } = useModal();\r\n const { config, getEntityConfig } = useConfig();\r\n const collectionConfig = getEntityConfig({ collectionSlug: slug });\r\n\r\n const routeResolver = getRouteResolver(config);\r\n const collectionUrl = routeResolver.api(`/${collectionConfig.slug}?pagination=false&depth=0`);\r\n\r\n // !!! check translations\r\n const { t } = useTranslation<any, any>();\r\n\r\n const format = (text: string, ...rest: unknown[]) => {\r\n return text.replace(/\\{(\\d)\\}/g, (m, g) => {\r\n const i = parseInt(g);\r\n return (i >= 0 && i < rest.length) ? String(rest[i]) : '';\r\n });\r\n };\r\n\r\n const { code: locale } = useLocale();\r\n\r\n const user = useAuth();\r\n\r\n const [dirty, setDirty] = useState<boolean>(false);\r\n const [valid, setValid] = useState<boolean>(false);\r\n const [error, setError] = useState<Error>();\r\n const [name, setName] = useState<string | null>(null);\r\n const [csv, setCSV] = useState<string | null>(null);\r\n const [keys, setKeys] = useState<string[] | null>(null);\r\n const [data, setData] = useState<IRow[] | null>(null);\r\n const [items, setItems] = useState<IImportItem[]>([]);\r\n const [logs, setLogs] = useState<ILog[]>([]);\r\n const [importMode, setImportMode] = useState<ImportMode>(INITIAL_DATA.importMode);\r\n const [dataParsing, setDataParsing] = useState<boolean>(INITIAL_DATA.dataParsing);\r\n\r\n const importModes = Object.entries(ImportMode).map(([k, v]) => ({\r\n value: v,\r\n label: t(`importExport:mode${k}`),\r\n }));\r\n\r\n const onSelectDidChange = (option: Option | Option[]) => {\r\n // console.log('onSelectDidChange', option);\r\n if (Array.isArray(option)) {\r\n return;\r\n }\r\n if (importMode !== option.value) {\r\n setValid(false);\r\n setImportMode(option.value as ImportMode);\r\n }\r\n };\r\n\r\n const onCheckboxkDidChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n // console.log('onCheckboxkDidChange', value);\r\n setValid(false);\r\n setDataParsing(!dataParsing);\r\n };\r\n\r\n const validate = useCallback(async (keys: string[], data: IRow[]) => {\r\n try {\r\n const messageByType = (key: string, type: ImportLogType) => {\r\n let message: string;\r\n switch (type) {\r\n case ImportLogType.Required:\r\n message = format(t('importExport:errorRequired'), key);\r\n break;\r\n case ImportLogType.Optional:\r\n message = format(t('importExport:errorOptional'), key);\r\n break;\r\n case ImportLogType.Invalid:\r\n message = format(t('importExport:errorInvalid'), key);\r\n break;\r\n case ImportLogType.Duplicate:\r\n message = format(t('importExport:errorDuplicate'), key);\r\n break;\r\n case ImportLogType.Unexpected:\r\n message = format(t('importExport:errorUnexpected'), key);\r\n break;\r\n }\r\n return message;\r\n };\r\n\r\n const addLog = (logs: ILog[], key: string, type: ImportLogType, invalid?: string): ILog => {\r\n const message = messageByType(key, type);\r\n const id = invalid ? `${key}-${type}-${invalid}` : `${key}-${type}`;\r\n const log = once<ILog>(logs, { id, key, type, message, invalid, count: 0 });\r\n log.count++;\r\n return log;\r\n };\r\n\r\n const itemOptionalKeys: string[] = [];\r\n const itemKeys = keys;\r\n\r\n // collecting model fields & keys\r\n const fields = collectionConfig.fields\r\n .filter(x => 'name' in x && x['name'] !== undefined && x.type !== 'ui') as (ClientField & { name: string })[];\r\n const fieldKeys = fields.map(x => x['name']);\r\n const requiredFields = fields.filter(x => {\r\n if (x['name'] === 'id' && importMode === ImportMode.Update) {\r\n return true;\r\n } else {\r\n return 'required' in x && x['required'] === true;\r\n }\r\n });\r\n const uniqueFields = fields.filter(x => x['unique'] === true);\r\n const requiredFieldKeys = requiredFields.map(x => x['name']);\r\n const optionalFieldKeys = fieldKeys.filter(x => !requiredFieldKeys.includes(x));\r\n const uniqueFieldKeys = uniqueFields.map(x => x['name']);\r\n\r\n let items: IImportItem[] = [];\r\n\r\n // parse values\r\n const valueParsers = itemKeys.map(key => {\r\n let parseValue = (item: IRow): string | number | boolean | Date | undefined => item[key];\r\n if (fieldKeys.includes(key)) {\r\n const field = collectionConfig.fields.find(x => 'name' in x && x['name'] === key);\r\n if (field) {\r\n switch (field.type) {\r\n case 'checkbox':\r\n parseValue = (item: IRow) => item[key] !== undefined ? Boolean(item[key]) : item[key];\r\n break;\r\n case 'date':\r\n parseValue = (item: IRow) => item[key] !== undefined ? new Date(item[key]) : item[key];\r\n break;\r\n case 'number':\r\n parseValue = (item: IRow) => item[key] !== undefined ? Number(item[key]) : item[key];\r\n break;\r\n }\r\n }\r\n }\r\n return parseValue;\r\n });\r\n\r\n for (const row of data) {\r\n const item = {};\r\n itemKeys.forEach((key, i) => {\r\n const parser = valueParsers[i];\r\n if (parser) {\r\n (item as any)[key] = parser(row);\r\n }\r\n });\r\n items.push(item);\r\n }\r\n\r\n if (dataParsing && typeof parser === 'function') {\r\n items = parser(items);\r\n }\r\n\r\n // console.log('data', data);\r\n // console.log('items', items);\r\n\r\n // collecting stored values\r\n const httpResponse = await fetch(collectionUrl, {\r\n method: 'GET',\r\n credentials: 'include',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n });\r\n if (!httpResponse.ok) {\r\n throw httpResponse;\r\n }\r\n const storedItems = await httpResponse.json();\r\n // console.log('rows', rows, 'data', result.data);\r\n\r\n // collecting logs\r\n const logs: ILog[] = [];\r\n // required fields\r\n requiredFieldKeys.forEach(key => {\r\n if (!itemKeys.includes(key) || itemOptionalKeys.includes(key)) {\r\n addLog(logs, key, ImportLogType.Required);\r\n }\r\n });\r\n // optional fields\r\n optionalFieldKeys.forEach(key => {\r\n if (!itemKeys.includes(key)) {\r\n addLog(logs, key, ImportLogType.Optional);\r\n }\r\n });\r\n // deep check values\r\n for (const key of itemKeys) {\r\n if (fieldKeys.includes(key)) {\r\n const field = collectionConfig.fields.find(x => 'name' in x && x['name'] === key);\r\n if (field) {\r\n const validate = 'validate' in field ? field['validate'] : undefined;\r\n const values: (string | number | boolean | Date | undefined)[] = [];\r\n const storedValues = uniqueFieldKeys.includes(key) ? storedItems.map((x: any) => x[key]) : [];\r\n for (const item of items) {\r\n const value = item[key];\r\n // validate field\r\n if (typeof validate === 'function') {\r\n const validation = await validate(value, {\r\n data: item,\r\n siblingData: item,\r\n operation: 'create',\r\n user,\r\n t,\r\n });\r\n if (validation !== true) {\r\n // console.log(key, value, validation, item);\r\n if (logs.find(x =>\r\n x.key === 'key' &&\r\n x.type === ImportLogType.Invalid\r\n ) === undefined) {\r\n addLog(logs, key, ImportLogType.Invalid, validation as string);\r\n }\r\n }\r\n }\r\n // unique field\r\n if (uniqueFieldKeys.includes(key) && (\r\n values.includes(value) ||\r\n (importMode === ImportMode.Append ? storedValues.includes(value) : false)\r\n )) {\r\n addLog(logs, key, ImportLogType.Duplicate, String(value));\r\n }\r\n values.push(value);\r\n }\r\n }\r\n } else {\r\n addLog(logs, key, ImportLogType.Unexpected);\r\n }\r\n }\r\n\r\n const sortOrder = Object.values(ImportLogType);\r\n logs.sort((a, b) => {\r\n return sortOrder.indexOf(a.type) - sortOrder.indexOf(b.type);\r\n });\r\n\r\n setItems(items);\r\n setLogs(logs);\r\n\r\n const errors = logs.filter(x => ImportLogInvalidTypes.includes(x.type));\r\n if (errors.length === 0) {\r\n setValid(true);\r\n }\r\n\r\n // console.log(logs, items, itemKeys, itemOptionalKeys, fieldKeys, requiredFieldKeys, optionalFieldKeys);\r\n\r\n } catch (error) {\r\n console.log('parse error', error);\r\n setError(error as Error);\r\n }\r\n }, [collectionUrl, importMode, dataParsing, parser, collectionConfig.fields, t, user]);\r\n\r\n useEffect(() => {\r\n if (keys && data) {\r\n validate(keys, data);\r\n }\r\n }, [keys, data, importMode, validate]);\r\n\r\n const onDrop = useCallback((acceptedFiles: File[]) => {\r\n const acceptedFile = acceptedFiles.find(() => true);\r\n if (acceptedFile) {\r\n const reader = new FileReader();\r\n reader.onabort = () => console.log('file reading was aborted');\r\n reader.onerror = () => console.log('file reading has failed');\r\n reader.onload = () => {\r\n // Do whatever you want with the file contents\r\n const csv = reader.result as string;\r\n // console.log('csv', csv);\r\n // parsing csv to { data:[][] }\r\n const result = Papa.parse(csv);\r\n const resultData: string[][] = result.data as string[][];\r\n // collecting imported keys & data\r\n let keys: string[] = [];\r\n const data: IRow[] = resultData.reduce((p, c, i) => {\r\n if (i === 0) {\r\n keys = c;\r\n } else {\r\n const item: Record<string, string> = {};\r\n keys.forEach((key, k) => {\r\n if (c[k] !== undefined) {\r\n item[key] = c[k];\r\n }\r\n });\r\n p.push(item);\r\n }\r\n return p;\r\n }, [] as IRow[]);\r\n setName(acceptedFile.name);\r\n setCSV(csv);\r\n setKeys(keys);\r\n setData(data);\r\n setDirty(true);\r\n };\r\n // reader.readAsArrayBuffer(file);\r\n reader.readAsText(acceptedFile);\r\n }\r\n }, []);\r\n\r\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\r\n accept: {\r\n 'text/csv': [],\r\n },\r\n maxSize: 1048576 * 20,\r\n maxFiles: 1,\r\n onDrop,\r\n });\r\n\r\n const onSubmit = async () => {\r\n // console.log('ImportModal.onSubmit');\r\n try {\r\n const url = routeResolver.api(`/${collectionConfig.slug}/import?locale=${locale}&mode=${importMode}`);\r\n\r\n const httpResponse = await fetch(url, {\r\n method: 'POST',\r\n body: JSON.stringify({ items }),\r\n credentials: 'include',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n });\r\n\r\n if (!httpResponse.ok) {\r\n throw httpResponse;\r\n }\r\n\r\n const response = await httpResponse.json();\r\n // console.log('ImportModal.onSubmit', response);\r\n toast.success(t('importExport:success'));\r\n closeAllModals();\r\n\r\n } catch (error) {\r\n console.log('ImportModal.onSubmit.error', error);\r\n toast.error(format(t('importExport:failure'), collectionConfig.slug));\r\n }\r\n };\r\n\r\n const onClose = () => {\r\n // console.log('onClose');\r\n closeAllModals();\r\n };\r\n\r\n const onClear = () => {\r\n // console.log('onClear');\r\n setValid(false);\r\n setDirty(false);\r\n setName(null);\r\n setCSV(null);\r\n setKeys(null);\r\n setData(null);\r\n setItems([]);\r\n setLogs([]);\r\n };\r\n\r\n return (\r\n <MinimalTemplate>\r\n <header className={`${baseClass}__header`}>\r\n <h3>{t('importExport:modalTitle')}</h3>\r\n <Button buttonStyle=\"none\" onClick={onClose}><XIcon /></Button>\r\n </header>\r\n <main className={`${baseClass}__main`}>\r\n <Form onSubmit={onSubmit}>\r\n <div className=\"render-fields\">\r\n <SelectInput\r\n // isClearable={viewType === 'list'}\r\n label={t('importExport:importMode')}\r\n name=\"importMode\"\r\n path={'importMode'}\r\n options={importModes}\r\n onChange={onSelectDidChange}\r\n />\r\n {typeof parser === 'function' && (\r\n <CheckboxInput\r\n label={t('importExport:enableDataParsing')}\r\n id=\"importMode\"\r\n name=\"dataParsing\"\r\n onToggle={onCheckboxkDidChange}\r\n />\r\n )}\r\n </div>\r\n {data ? (\r\n <>\r\n <div dangerouslySetInnerHTML={{ __html: format(t('importExport:records'), items.length, name) }} ></div>\r\n {logs.length > 0 && (\r\n <ul className={`${baseClass}__logs`}>\r\n {logs.map((log, i) => (\r\n <li key={`log-${i}`} className={`${baseClass}__log ${baseClass}__log--${log.type}`}>\r\n {log.count} {log.message} <i>{log.invalid}</i>\r\n </li>\r\n ))}\r\n </ul>\r\n )}\r\n </>\r\n ) : (\r\n <div className={`${baseClass}__dropzone`} {...getRootProps()}>\r\n <input className={`${baseClass}__input`} {...getInputProps()} />\r\n {isDragActive ? (\r\n <div>{t('importExport:dropTitle')}</div>\r\n ) : (\r\n <div>{t('importExport:dropAbstract')}</div>\r\n )}\r\n </div>\r\n )}\r\n {error && (\r\n <>\r\n <div>{t('importExport:parseError')}</div>\r\n {error.message && <div>{error.message}</div>}\r\n </>\r\n )}\r\n <div className={`${baseClass}__foot`}>\r\n {dirty && <Button type=\"button\" buttonStyle=\"secondary\" onClick={onClear}>\r\n {t('importExport:clear')}\r\n </Button>}\r\n <Button type=\"submit\" disabled={!valid}>\r\n {t('importExport:submit')}\r\n </Button>\r\n </div>\r\n </Form>\r\n </main>\r\n </MinimalTemplate>\r\n );\r\n};\r\n\r\nfunction once<T extends IEntity = IEntity>(items: T[], item: T): T {\r\n const exhistingItem = items.find(x => x.id === item.id);\r\n if (exhistingItem) {\r\n return exhistingItem;\r\n }\r\n items.push(item);\r\n return item;\r\n}\r\n"],"names":["MinimalTemplate","Button","CheckboxInput","Form","SelectInput","XIcon","toast","useAuth","useConfig","useLocale","useModal","useTranslation","getRouteResolver","Papa","React","useCallback","useEffect","useState","useDropzone","ImportLogInvalidTypes","ImportLogType","ImportMode","INITIAL_DATA","importMode","Append","dataParsing","baseClass","ImportModal","parser","slug","closeAllModals","config","getEntityConfig","collectionConfig","collectionSlug","routeResolver","collectionUrl","api","t","format","text","rest","replace","m","g","i","parseInt","length","String","code","locale","user","dirty","setDirty","valid","setValid","error","setError","name","setName","csv","setCSV","keys","setKeys","data","setData","items","setItems","logs","setLogs","setImportMode","setDataParsing","importModes","Object","entries","map","k","v","value","label","onSelectDidChange","option","Array","isArray","onCheckboxkDidChange","event","validate","messageByType","key","type","message","Required","Optional","Invalid","Duplicate","Unexpected","addLog","invalid","id","log","once","count","itemOptionalKeys","itemKeys","fields","filter","x","undefined","fieldKeys","requiredFields","Update","uniqueFields","requiredFieldKeys","optionalFieldKeys","includes","uniqueFieldKeys","valueParsers","parseValue","item","field","find","Boolean","Date","Number","row","forEach","push","httpResponse","fetch","method","credentials","headers","ok","storedItems","json","values","storedValues","validation","siblingData","operation","sortOrder","sort","a","b","indexOf","errors","console","onDrop","acceptedFiles","acceptedFile","reader","FileReader","onabort","onerror","onload","result","parse","resultData","reduce","p","c","readAsText","getRootProps","getInputProps","isDragActive","accept","maxSize","maxFiles","onSubmit","url","body","JSON","stringify","response","success","onClose","onClear","header","className","h3","buttonStyle","onClick","main","div","path","options","onChange","onToggle","dangerouslySetInnerHTML","__html","ul","li","input","disabled","exhistingItem"],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ @use "sass:math";
2
+
3
+ .import-modal {
4
+
5
+ &__header {
6
+ width: 100%;
7
+ display: flex;
8
+ justify-content: space-between;
9
+ margin: 0 0 0.6rem 0;
10
+
11
+ h3 {
12
+ display: flex;
13
+ gap: 0.5em;
14
+ margin: 0;
15
+
16
+ svg {
17
+ width: 1em;
18
+ height: 1em;
19
+ fill: currentColor;
20
+ }
21
+ }
22
+ }
23
+
24
+ &__main {
25
+
26
+ .rich-text__editor {
27
+ overflow-x: hidden;
28
+ overflow-y: auto;
29
+ max-height: Max(160px, calc(100vh - 650px));
30
+ }
31
+ }
32
+
33
+ &__foot {
34
+ display: flex;
35
+ gap: 2rem;
36
+
37
+ &>.btn,
38
+ &>.form-submit {
39
+ flex: 1 1 calc(50% - 1rem);
40
+
41
+ &>.btn {
42
+ width: 100%;
43
+ }
44
+ }
45
+ }
46
+
47
+ &__dropzone {
48
+ text-align: center;
49
+ padding: 20px;
50
+ margin-top: var(--base);
51
+ border: 3px #2f2f2f dashed;
52
+ width: 100%;
53
+ height: 150px;
54
+ display: flex;
55
+ justify-content: center;
56
+ align-items: center;
57
+ line-height: 1;
58
+ cursor: pointer;
59
+ }
60
+
61
+ &__logs {
62
+ display: flex;
63
+ flex-direction: column;
64
+ row-gap: 5px;
65
+ list-style: none;
66
+ padding: 0;
67
+ margin: 1em 0 0 0;
68
+ line-height: 1.4;
69
+ padding: 1rem;
70
+ border: 2px solid #2f2f2f;
71
+ border-radius: 8px;
72
+ max-height: 150px;
73
+ overflow-y: auto;
74
+ }
75
+
76
+ &__log {
77
+ padding: 0;
78
+
79
+ &--duplicate {
80
+ color: red;
81
+ }
82
+
83
+ &--invalid {
84
+ color: red;
85
+ }
86
+
87
+ &--required {
88
+ color: red;
89
+ }
90
+
91
+ &--unexpected {
92
+ color: orange;
93
+ }
94
+
95
+ &--optional {
96
+ color: grey;
97
+ }
98
+ }
99
+ }
@@ -0,0 +1,3 @@
1
+ export { };
2
+
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/ImportExport/types.ts"],"sourcesContent":["export type IImportItem = Record<string, string | number | boolean | Date>;\r\n"],"names":[],"mappings":"AAAA,WAA2E"}