@ruya.sa/plugin-import-export 3.71.3

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 (410) hide show
  1. package/README.md +7 -0
  2. package/dist/components/CollectionField/index.d.ts +3 -0
  3. package/dist/components/CollectionField/index.d.ts.map +1 -0
  4. package/dist/components/CollectionField/index.js +29 -0
  5. package/dist/components/CollectionField/index.js.map +1 -0
  6. package/dist/components/ExportListMenuItem/index.d.ts +6 -0
  7. package/dist/components/ExportListMenuItem/index.d.ts.map +1 -0
  8. package/dist/components/ExportListMenuItem/index.js +44 -0
  9. package/dist/components/ExportListMenuItem/index.js.map +1 -0
  10. package/dist/components/ExportPreview/index.d.ts +4 -0
  11. package/dist/components/ExportPreview/index.d.ts.map +1 -0
  12. package/dist/components/ExportPreview/index.js +252 -0
  13. package/dist/components/ExportPreview/index.js.map +1 -0
  14. package/dist/components/ExportPreview/index.scss +36 -0
  15. package/dist/components/ExportSaveButton/index.d.ts +3 -0
  16. package/dist/components/ExportSaveButton/index.d.ts.map +1 -0
  17. package/dist/components/ExportSaveButton/index.js +110 -0
  18. package/dist/components/ExportSaveButton/index.js.map +1 -0
  19. package/dist/components/FieldsToExport/index.d.ts +3 -0
  20. package/dist/components/FieldsToExport/index.d.ts.map +1 -0
  21. package/dist/components/FieldsToExport/index.js +87 -0
  22. package/dist/components/FieldsToExport/index.js.map +1 -0
  23. package/dist/components/FieldsToExport/index.scss +0 -0
  24. package/dist/components/FieldsToExport/reduceFields.d.ts +13 -0
  25. package/dist/components/FieldsToExport/reduceFields.d.ts.map +1 -0
  26. package/dist/components/FieldsToExport/reduceFields.js +109 -0
  27. package/dist/components/FieldsToExport/reduceFields.js.map +1 -0
  28. package/dist/components/ImportCollectionField/index.d.ts +3 -0
  29. package/dist/components/ImportCollectionField/index.d.ts.map +1 -0
  30. package/dist/components/ImportCollectionField/index.js +17 -0
  31. package/dist/components/ImportCollectionField/index.js.map +1 -0
  32. package/dist/components/ImportExportProvider/index.d.ts +12 -0
  33. package/dist/components/ImportExportProvider/index.d.ts.map +1 -0
  34. package/dist/components/ImportExportProvider/index.js +20 -0
  35. package/dist/components/ImportExportProvider/index.js.map +1 -0
  36. package/dist/components/ImportListMenuItem/index.d.ts +6 -0
  37. package/dist/components/ImportListMenuItem/index.d.ts.map +1 -0
  38. package/dist/components/ImportListMenuItem/index.js +48 -0
  39. package/dist/components/ImportListMenuItem/index.js.map +1 -0
  40. package/dist/components/ImportPreview/index.d.ts +4 -0
  41. package/dist/components/ImportPreview/index.d.ts.map +1 -0
  42. package/dist/components/ImportPreview/index.js +624 -0
  43. package/dist/components/ImportPreview/index.js.map +1 -0
  44. package/dist/components/ImportPreview/index.scss +41 -0
  45. package/dist/components/ImportSaveButton/index.d.ts +2 -0
  46. package/dist/components/ImportSaveButton/index.d.ts.map +1 -0
  47. package/dist/components/ImportSaveButton/index.js +18 -0
  48. package/dist/components/ImportSaveButton/index.js.map +1 -0
  49. package/dist/components/Page/index.d.ts +4 -0
  50. package/dist/components/Page/index.d.ts.map +1 -0
  51. package/dist/components/Page/index.js +40 -0
  52. package/dist/components/Page/index.js.map +1 -0
  53. package/dist/components/Page/index.scss +5 -0
  54. package/dist/components/SelectionToUseField/index.d.ts +3 -0
  55. package/dist/components/SelectionToUseField/index.d.ts.map +1 -0
  56. package/dist/components/SelectionToUseField/index.js +128 -0
  57. package/dist/components/SelectionToUseField/index.js.map +1 -0
  58. package/dist/components/SortBy/index.d.ts +4 -0
  59. package/dist/components/SortBy/index.d.ts.map +1 -0
  60. package/dist/components/SortBy/index.js +133 -0
  61. package/dist/components/SortBy/index.js.map +1 -0
  62. package/dist/components/SortBy/index.scss +3 -0
  63. package/dist/components/SortOrder/index.d.ts +4 -0
  64. package/dist/components/SortOrder/index.d.ts.map +1 -0
  65. package/dist/components/SortOrder/index.js +121 -0
  66. package/dist/components/SortOrder/index.js.map +1 -0
  67. package/dist/components/SortOrder/index.scss +3 -0
  68. package/dist/constants.d.ts +21 -0
  69. package/dist/constants.d.ts.map +1 -0
  70. package/dist/constants.js +21 -0
  71. package/dist/constants.js.map +1 -0
  72. package/dist/export/batchProcessor.d.ts +107 -0
  73. package/dist/export/batchProcessor.d.ts.map +1 -0
  74. package/dist/export/batchProcessor.js +187 -0
  75. package/dist/export/batchProcessor.js.map +1 -0
  76. package/dist/export/createExport.d.ts +37 -0
  77. package/dist/export/createExport.d.ts.map +1 -0
  78. package/dist/export/createExport.js +385 -0
  79. package/dist/export/createExport.js.map +1 -0
  80. package/dist/export/getCreateExportCollectionTask.d.ts +16 -0
  81. package/dist/export/getCreateExportCollectionTask.d.ts.map +1 -0
  82. package/dist/export/getCreateExportCollectionTask.js +35 -0
  83. package/dist/export/getCreateExportCollectionTask.js.map +1 -0
  84. package/dist/export/getExportCollection.d.ts +8 -0
  85. package/dist/export/getExportCollection.d.ts.map +1 -0
  86. package/dist/export/getExportCollection.js +100 -0
  87. package/dist/export/getExportCollection.js.map +1 -0
  88. package/dist/export/getFields.d.ts +10 -0
  89. package/dist/export/getFields.d.ts.map +1 -0
  90. package/dist/export/getFields.js +244 -0
  91. package/dist/export/getFields.js.map +1 -0
  92. package/dist/export/handleDownload.d.ts +3 -0
  93. package/dist/export/handleDownload.d.ts.map +1 -0
  94. package/dist/export/handleDownload.js +42 -0
  95. package/dist/export/handleDownload.js.map +1 -0
  96. package/dist/export/handlePreview.d.ts +3 -0
  97. package/dist/export/handlePreview.d.ts.map +1 -0
  98. package/dist/export/handlePreview.js +163 -0
  99. package/dist/export/handlePreview.js.map +1 -0
  100. package/dist/exports/rsc.d.ts +15 -0
  101. package/dist/exports/rsc.d.ts.map +1 -0
  102. package/dist/exports/rsc.js +16 -0
  103. package/dist/exports/rsc.js.map +1 -0
  104. package/dist/exports/types.d.ts +2 -0
  105. package/dist/exports/types.d.ts.map +1 -0
  106. package/dist/exports/types.js +3 -0
  107. package/dist/exports/types.js.map +1 -0
  108. package/dist/import/batchProcessor.d.ts +46 -0
  109. package/dist/import/batchProcessor.d.ts.map +1 -0
  110. package/dist/import/batchProcessor.js +529 -0
  111. package/dist/import/batchProcessor.js.map +1 -0
  112. package/dist/import/createImport.d.ts +45 -0
  113. package/dist/import/createImport.d.ts.map +1 -0
  114. package/dist/import/createImport.js +175 -0
  115. package/dist/import/createImport.js.map +1 -0
  116. package/dist/import/getCreateImportCollectionTask.d.ts +13 -0
  117. package/dist/import/getCreateImportCollectionTask.d.ts.map +1 -0
  118. package/dist/import/getCreateImportCollectionTask.js +81 -0
  119. package/dist/import/getCreateImportCollectionTask.js.map +1 -0
  120. package/dist/import/getFields.d.ts +7 -0
  121. package/dist/import/getFields.d.ts.map +1 -0
  122. package/dist/import/getFields.js +150 -0
  123. package/dist/import/getFields.js.map +1 -0
  124. package/dist/import/getImportCollection.d.ts +8 -0
  125. package/dist/import/getImportCollection.d.ts.map +1 -0
  126. package/dist/import/getImportCollection.js +258 -0
  127. package/dist/import/getImportCollection.js.map +1 -0
  128. package/dist/import/handlePreview.d.ts +3 -0
  129. package/dist/import/handlePreview.d.ts.map +1 -0
  130. package/dist/import/handlePreview.js +94 -0
  131. package/dist/import/handlePreview.js.map +1 -0
  132. package/dist/index.d.ts +32 -0
  133. package/dist/index.d.ts.map +1 -0
  134. package/dist/index.js +120 -0
  135. package/dist/index.js.map +1 -0
  136. package/dist/translations/index.d.ts +6 -0
  137. package/dist/translations/index.d.ts.map +1 -0
  138. package/dist/translations/index.js +84 -0
  139. package/dist/translations/index.js.map +1 -0
  140. package/dist/translations/languages/ar.d.ts +4 -0
  141. package/dist/translations/languages/ar.d.ts.map +1 -0
  142. package/dist/translations/languages/ar.js +48 -0
  143. package/dist/translations/languages/ar.js.map +1 -0
  144. package/dist/translations/languages/az.d.ts +4 -0
  145. package/dist/translations/languages/az.d.ts.map +1 -0
  146. package/dist/translations/languages/az.js +48 -0
  147. package/dist/translations/languages/az.js.map +1 -0
  148. package/dist/translations/languages/bg.d.ts +4 -0
  149. package/dist/translations/languages/bg.d.ts.map +1 -0
  150. package/dist/translations/languages/bg.js +48 -0
  151. package/dist/translations/languages/bg.js.map +1 -0
  152. package/dist/translations/languages/bnBd.d.ts +4 -0
  153. package/dist/translations/languages/bnBd.d.ts.map +1 -0
  154. package/dist/translations/languages/bnBd.js +48 -0
  155. package/dist/translations/languages/bnBd.js.map +1 -0
  156. package/dist/translations/languages/bnIn.d.ts +4 -0
  157. package/dist/translations/languages/bnIn.d.ts.map +1 -0
  158. package/dist/translations/languages/bnIn.js +48 -0
  159. package/dist/translations/languages/bnIn.js.map +1 -0
  160. package/dist/translations/languages/ca.d.ts +4 -0
  161. package/dist/translations/languages/ca.d.ts.map +1 -0
  162. package/dist/translations/languages/ca.js +48 -0
  163. package/dist/translations/languages/ca.js.map +1 -0
  164. package/dist/translations/languages/cs.d.ts +4 -0
  165. package/dist/translations/languages/cs.d.ts.map +1 -0
  166. package/dist/translations/languages/cs.js +48 -0
  167. package/dist/translations/languages/cs.js.map +1 -0
  168. package/dist/translations/languages/da.d.ts +4 -0
  169. package/dist/translations/languages/da.d.ts.map +1 -0
  170. package/dist/translations/languages/da.js +48 -0
  171. package/dist/translations/languages/da.js.map +1 -0
  172. package/dist/translations/languages/de.d.ts +4 -0
  173. package/dist/translations/languages/de.d.ts.map +1 -0
  174. package/dist/translations/languages/de.js +48 -0
  175. package/dist/translations/languages/de.js.map +1 -0
  176. package/dist/translations/languages/en.d.ts +45 -0
  177. package/dist/translations/languages/en.d.ts.map +1 -0
  178. package/dist/translations/languages/en.js +48 -0
  179. package/dist/translations/languages/en.js.map +1 -0
  180. package/dist/translations/languages/es.d.ts +4 -0
  181. package/dist/translations/languages/es.d.ts.map +1 -0
  182. package/dist/translations/languages/es.js +48 -0
  183. package/dist/translations/languages/es.js.map +1 -0
  184. package/dist/translations/languages/et.d.ts +4 -0
  185. package/dist/translations/languages/et.d.ts.map +1 -0
  186. package/dist/translations/languages/et.js +48 -0
  187. package/dist/translations/languages/et.js.map +1 -0
  188. package/dist/translations/languages/fa.d.ts +4 -0
  189. package/dist/translations/languages/fa.d.ts.map +1 -0
  190. package/dist/translations/languages/fa.js +48 -0
  191. package/dist/translations/languages/fa.js.map +1 -0
  192. package/dist/translations/languages/fr.d.ts +4 -0
  193. package/dist/translations/languages/fr.d.ts.map +1 -0
  194. package/dist/translations/languages/fr.js +48 -0
  195. package/dist/translations/languages/fr.js.map +1 -0
  196. package/dist/translations/languages/he.d.ts +4 -0
  197. package/dist/translations/languages/he.d.ts.map +1 -0
  198. package/dist/translations/languages/he.js +48 -0
  199. package/dist/translations/languages/he.js.map +1 -0
  200. package/dist/translations/languages/hr.d.ts +4 -0
  201. package/dist/translations/languages/hr.d.ts.map +1 -0
  202. package/dist/translations/languages/hr.js +48 -0
  203. package/dist/translations/languages/hr.js.map +1 -0
  204. package/dist/translations/languages/hu.d.ts +4 -0
  205. package/dist/translations/languages/hu.d.ts.map +1 -0
  206. package/dist/translations/languages/hu.js +48 -0
  207. package/dist/translations/languages/hu.js.map +1 -0
  208. package/dist/translations/languages/hy.d.ts +4 -0
  209. package/dist/translations/languages/hy.d.ts.map +1 -0
  210. package/dist/translations/languages/hy.js +48 -0
  211. package/dist/translations/languages/hy.js.map +1 -0
  212. package/dist/translations/languages/id.d.ts +4 -0
  213. package/dist/translations/languages/id.d.ts.map +1 -0
  214. package/dist/translations/languages/id.js +48 -0
  215. package/dist/translations/languages/id.js.map +1 -0
  216. package/dist/translations/languages/is.d.ts +4 -0
  217. package/dist/translations/languages/is.d.ts.map +1 -0
  218. package/dist/translations/languages/is.js +48 -0
  219. package/dist/translations/languages/is.js.map +1 -0
  220. package/dist/translations/languages/it.d.ts +4 -0
  221. package/dist/translations/languages/it.d.ts.map +1 -0
  222. package/dist/translations/languages/it.js +48 -0
  223. package/dist/translations/languages/it.js.map +1 -0
  224. package/dist/translations/languages/ja.d.ts +4 -0
  225. package/dist/translations/languages/ja.d.ts.map +1 -0
  226. package/dist/translations/languages/ja.js +48 -0
  227. package/dist/translations/languages/ja.js.map +1 -0
  228. package/dist/translations/languages/ko.d.ts +4 -0
  229. package/dist/translations/languages/ko.d.ts.map +1 -0
  230. package/dist/translations/languages/ko.js +48 -0
  231. package/dist/translations/languages/ko.js.map +1 -0
  232. package/dist/translations/languages/lt.d.ts +4 -0
  233. package/dist/translations/languages/lt.d.ts.map +1 -0
  234. package/dist/translations/languages/lt.js +48 -0
  235. package/dist/translations/languages/lt.js.map +1 -0
  236. package/dist/translations/languages/lv.d.ts +4 -0
  237. package/dist/translations/languages/lv.d.ts.map +1 -0
  238. package/dist/translations/languages/lv.js +48 -0
  239. package/dist/translations/languages/lv.js.map +1 -0
  240. package/dist/translations/languages/my.d.ts +4 -0
  241. package/dist/translations/languages/my.d.ts.map +1 -0
  242. package/dist/translations/languages/my.js +48 -0
  243. package/dist/translations/languages/my.js.map +1 -0
  244. package/dist/translations/languages/nb.d.ts +4 -0
  245. package/dist/translations/languages/nb.d.ts.map +1 -0
  246. package/dist/translations/languages/nb.js +48 -0
  247. package/dist/translations/languages/nb.js.map +1 -0
  248. package/dist/translations/languages/nl.d.ts +4 -0
  249. package/dist/translations/languages/nl.d.ts.map +1 -0
  250. package/dist/translations/languages/nl.js +48 -0
  251. package/dist/translations/languages/nl.js.map +1 -0
  252. package/dist/translations/languages/pl.d.ts +4 -0
  253. package/dist/translations/languages/pl.d.ts.map +1 -0
  254. package/dist/translations/languages/pl.js +48 -0
  255. package/dist/translations/languages/pl.js.map +1 -0
  256. package/dist/translations/languages/pt.d.ts +4 -0
  257. package/dist/translations/languages/pt.d.ts.map +1 -0
  258. package/dist/translations/languages/pt.js +48 -0
  259. package/dist/translations/languages/pt.js.map +1 -0
  260. package/dist/translations/languages/ro.d.ts +4 -0
  261. package/dist/translations/languages/ro.d.ts.map +1 -0
  262. package/dist/translations/languages/ro.js +48 -0
  263. package/dist/translations/languages/ro.js.map +1 -0
  264. package/dist/translations/languages/rs.d.ts +4 -0
  265. package/dist/translations/languages/rs.d.ts.map +1 -0
  266. package/dist/translations/languages/rs.js +48 -0
  267. package/dist/translations/languages/rs.js.map +1 -0
  268. package/dist/translations/languages/rsLatin.d.ts +4 -0
  269. package/dist/translations/languages/rsLatin.d.ts.map +1 -0
  270. package/dist/translations/languages/rsLatin.js +48 -0
  271. package/dist/translations/languages/rsLatin.js.map +1 -0
  272. package/dist/translations/languages/ru.d.ts +4 -0
  273. package/dist/translations/languages/ru.d.ts.map +1 -0
  274. package/dist/translations/languages/ru.js +48 -0
  275. package/dist/translations/languages/ru.js.map +1 -0
  276. package/dist/translations/languages/sk.d.ts +4 -0
  277. package/dist/translations/languages/sk.d.ts.map +1 -0
  278. package/dist/translations/languages/sk.js +48 -0
  279. package/dist/translations/languages/sk.js.map +1 -0
  280. package/dist/translations/languages/sl.d.ts +4 -0
  281. package/dist/translations/languages/sl.d.ts.map +1 -0
  282. package/dist/translations/languages/sl.js +48 -0
  283. package/dist/translations/languages/sl.js.map +1 -0
  284. package/dist/translations/languages/sv.d.ts +4 -0
  285. package/dist/translations/languages/sv.d.ts.map +1 -0
  286. package/dist/translations/languages/sv.js +48 -0
  287. package/dist/translations/languages/sv.js.map +1 -0
  288. package/dist/translations/languages/ta.d.ts +4 -0
  289. package/dist/translations/languages/ta.d.ts.map +1 -0
  290. package/dist/translations/languages/ta.js +48 -0
  291. package/dist/translations/languages/ta.js.map +1 -0
  292. package/dist/translations/languages/th.d.ts +4 -0
  293. package/dist/translations/languages/th.d.ts.map +1 -0
  294. package/dist/translations/languages/th.js +48 -0
  295. package/dist/translations/languages/th.js.map +1 -0
  296. package/dist/translations/languages/tr.d.ts +4 -0
  297. package/dist/translations/languages/tr.d.ts.map +1 -0
  298. package/dist/translations/languages/tr.js +48 -0
  299. package/dist/translations/languages/tr.js.map +1 -0
  300. package/dist/translations/languages/translation-schema.json +114 -0
  301. package/dist/translations/languages/uk.d.ts +4 -0
  302. package/dist/translations/languages/uk.d.ts.map +1 -0
  303. package/dist/translations/languages/uk.js +48 -0
  304. package/dist/translations/languages/uk.js.map +1 -0
  305. package/dist/translations/languages/vi.d.ts +4 -0
  306. package/dist/translations/languages/vi.d.ts.map +1 -0
  307. package/dist/translations/languages/vi.js +48 -0
  308. package/dist/translations/languages/vi.js.map +1 -0
  309. package/dist/translations/languages/zh.d.ts +4 -0
  310. package/dist/translations/languages/zh.d.ts.map +1 -0
  311. package/dist/translations/languages/zh.js +48 -0
  312. package/dist/translations/languages/zh.js.map +1 -0
  313. package/dist/translations/languages/zhTw.d.ts +4 -0
  314. package/dist/translations/languages/zhTw.d.ts.map +1 -0
  315. package/dist/translations/languages/zhTw.js +48 -0
  316. package/dist/translations/languages/zhTw.js.map +1 -0
  317. package/dist/translations/types.d.ts +38 -0
  318. package/dist/translations/types.d.ts.map +1 -0
  319. package/dist/translations/types.js +3 -0
  320. package/dist/translations/types.js.map +1 -0
  321. package/dist/types.d.ts +221 -0
  322. package/dist/types.d.ts.map +1 -0
  323. package/dist/types.js +5 -0
  324. package/dist/types.js.map +1 -0
  325. package/dist/utilities/buildDisabledFieldRegex.d.ts +5 -0
  326. package/dist/utilities/buildDisabledFieldRegex.d.ts.map +1 -0
  327. package/dist/utilities/buildDisabledFieldRegex.js +12 -0
  328. package/dist/utilities/buildDisabledFieldRegex.js.map +1 -0
  329. package/dist/utilities/collectDisabledFieldPaths.d.ts +15 -0
  330. package/dist/utilities/collectDisabledFieldPaths.d.ts.map +1 -0
  331. package/dist/utilities/collectDisabledFieldPaths.js +61 -0
  332. package/dist/utilities/collectDisabledFieldPaths.js.map +1 -0
  333. package/dist/utilities/flattenObject.d.ts +11 -0
  334. package/dist/utilities/flattenObject.d.ts.map +1 -0
  335. package/dist/utilities/flattenObject.js +129 -0
  336. package/dist/utilities/flattenObject.js.map +1 -0
  337. package/dist/utilities/getExportFieldFunctions.d.ts +12 -0
  338. package/dist/utilities/getExportFieldFunctions.d.ts.map +1 -0
  339. package/dist/utilities/getExportFieldFunctions.js +102 -0
  340. package/dist/utilities/getExportFieldFunctions.js.map +1 -0
  341. package/dist/utilities/getFilename.d.ts +6 -0
  342. package/dist/utilities/getFilename.d.ts.map +1 -0
  343. package/dist/utilities/getFilename.js +13 -0
  344. package/dist/utilities/getFilename.js.map +1 -0
  345. package/dist/utilities/getFlattenedFieldKeys.d.ts +24 -0
  346. package/dist/utilities/getFlattenedFieldKeys.d.ts.map +1 -0
  347. package/dist/utilities/getFlattenedFieldKeys.js +95 -0
  348. package/dist/utilities/getFlattenedFieldKeys.js.map +1 -0
  349. package/dist/utilities/getImportFieldFunctions.d.ts +12 -0
  350. package/dist/utilities/getImportFieldFunctions.d.ts.map +1 -0
  351. package/dist/utilities/getImportFieldFunctions.js +130 -0
  352. package/dist/utilities/getImportFieldFunctions.js.map +1 -0
  353. package/dist/utilities/getPluginCollections.d.ts +39 -0
  354. package/dist/utilities/getPluginCollections.d.ts.map +1 -0
  355. package/dist/utilities/getPluginCollections.js +102 -0
  356. package/dist/utilities/getPluginCollections.js.map +1 -0
  357. package/dist/utilities/getSchemaColumns.d.ts +43 -0
  358. package/dist/utilities/getSchemaColumns.d.ts.map +1 -0
  359. package/dist/utilities/getSchemaColumns.js +163 -0
  360. package/dist/utilities/getSchemaColumns.js.map +1 -0
  361. package/dist/utilities/getSelect.d.ts +11 -0
  362. package/dist/utilities/getSelect.d.ts.map +1 -0
  363. package/dist/utilities/getSelect.js +27 -0
  364. package/dist/utilities/getSelect.js.map +1 -0
  365. package/dist/utilities/getvalueAtPath.d.ts +15 -0
  366. package/dist/utilities/getvalueAtPath.d.ts.map +1 -0
  367. package/dist/utilities/getvalueAtPath.js +49 -0
  368. package/dist/utilities/getvalueAtPath.js.map +1 -0
  369. package/dist/utilities/parseCSV.d.ts +11 -0
  370. package/dist/utilities/parseCSV.d.ts.map +1 -0
  371. package/dist/utilities/parseCSV.js +67 -0
  372. package/dist/utilities/parseCSV.js.map +1 -0
  373. package/dist/utilities/parseCSV.spec.js +169 -0
  374. package/dist/utilities/parseCSV.spec.js.map +1 -0
  375. package/dist/utilities/parseJSON.d.ts +11 -0
  376. package/dist/utilities/parseJSON.d.ts.map +1 -0
  377. package/dist/utilities/parseJSON.js +25 -0
  378. package/dist/utilities/parseJSON.js.map +1 -0
  379. package/dist/utilities/processRichTextField.d.ts +6 -0
  380. package/dist/utilities/processRichTextField.d.ts.map +1 -0
  381. package/dist/utilities/processRichTextField.js +45 -0
  382. package/dist/utilities/processRichTextField.js.map +1 -0
  383. package/dist/utilities/removeDisabledFields.d.ts +15 -0
  384. package/dist/utilities/removeDisabledFields.d.ts.map +1 -0
  385. package/dist/utilities/removeDisabledFields.js +66 -0
  386. package/dist/utilities/removeDisabledFields.js.map +1 -0
  387. package/dist/utilities/setNestedValue.d.ts +19 -0
  388. package/dist/utilities/setNestedValue.d.ts.map +1 -0
  389. package/dist/utilities/setNestedValue.js +55 -0
  390. package/dist/utilities/setNestedValue.js.map +1 -0
  391. package/dist/utilities/sortHelpers.d.ts +6 -0
  392. package/dist/utilities/sortHelpers.d.ts.map +1 -0
  393. package/dist/utilities/sortHelpers.js +14 -0
  394. package/dist/utilities/sortHelpers.js.map +1 -0
  395. package/dist/utilities/unflattenObject.d.ts +11 -0
  396. package/dist/utilities/unflattenObject.d.ts.map +1 -0
  397. package/dist/utilities/unflattenObject.js +431 -0
  398. package/dist/utilities/unflattenObject.js.map +1 -0
  399. package/dist/utilities/unflattenObject.spec.js +680 -0
  400. package/dist/utilities/unflattenObject.spec.js.map +1 -0
  401. package/dist/utilities/useBatchProcessor.d.ts +103 -0
  402. package/dist/utilities/useBatchProcessor.d.ts.map +1 -0
  403. package/dist/utilities/useBatchProcessor.js +88 -0
  404. package/dist/utilities/useBatchProcessor.js.map +1 -0
  405. package/dist/utilities/validateLimitValue.d.ts +3 -0
  406. package/dist/utilities/validateLimitValue.d.ts.map +1 -0
  407. package/dist/utilities/validateLimitValue.js +12 -0
  408. package/dist/utilities/validateLimitValue.js.map +1 -0
  409. package/license.md +22 -0
  410. package/package.json +90 -0
package/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # Payload Import/Export Plugin
2
+
3
+ A plugin for [Payload](https://github.com/payloadcms/payload) to easily import and export data.
4
+
5
+ - [Source code](https://github.com/payloadcms/payload/tree/main/packages/plugin-import-export)
6
+ - [Documentation](https://payloadcms.com/docs/plugins/import-export)
7
+ - [Documentation source](https://github.com/payloadcms/payload/tree/main/docs/plugins/import-export.mdx)
@@ -0,0 +1,3 @@
1
+ import type React from 'react';
2
+ export declare const CollectionField: React.FC;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/CollectionField/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAO9B,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAiBnC,CAAA"}
@@ -0,0 +1,29 @@
1
+ 'use client';
2
+ import { useDocumentInfo, useField } from '@ruya.sa/ui';
3
+ import { useEffect } from 'react';
4
+ import { useImportExport } from '../ImportExportProvider/index.js';
5
+ export const CollectionField = ()=>{
6
+ const { id, collectionSlug } = useDocumentInfo();
7
+ const { setValue } = useField({
8
+ path: 'collectionSlug'
9
+ });
10
+ const { collection } = useImportExport();
11
+ useEffect(()=>{
12
+ if (id) {
13
+ return;
14
+ }
15
+ if (collection) {
16
+ setValue(collection);
17
+ } else if (collectionSlug) {
18
+ setValue(collectionSlug);
19
+ }
20
+ }, [
21
+ id,
22
+ collection,
23
+ setValue,
24
+ collectionSlug
25
+ ]);
26
+ return null;
27
+ };
28
+
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/CollectionField/index.tsx"],"sourcesContent":["'use client'\nimport type React from 'react'\n\nimport { useDocumentInfo, useField } from '@ruya.sa/ui'\nimport { useEffect } from 'react'\n\nimport { useImportExport } from '../ImportExportProvider/index.js'\n\nexport const CollectionField: React.FC = () => {\n const { id, collectionSlug } = useDocumentInfo()\n const { setValue } = useField({ path: 'collectionSlug' })\n const { collection } = useImportExport()\n\n useEffect(() => {\n if (id) {\n return\n }\n if (collection) {\n setValue(collection)\n } else if (collectionSlug) {\n setValue(collectionSlug)\n }\n }, [id, collection, setValue, collectionSlug])\n\n return null\n}\n"],"names":["useDocumentInfo","useField","useEffect","useImportExport","CollectionField","id","collectionSlug","setValue","path","collection"],"mappings":"AAAA;AAGA,SAASA,eAAe,EAAEC,QAAQ,QAAQ,cAAa;AACvD,SAASC,SAAS,QAAQ,QAAO;AAEjC,SAASC,eAAe,QAAQ,mCAAkC;AAElE,OAAO,MAAMC,kBAA4B;IACvC,MAAM,EAAEC,EAAE,EAAEC,cAAc,EAAE,GAAGN;IAC/B,MAAM,EAAEO,QAAQ,EAAE,GAAGN,SAAS;QAAEO,MAAM;IAAiB;IACvD,MAAM,EAAEC,UAAU,EAAE,GAAGN;IAEvBD,UAAU;QACR,IAAIG,IAAI;YACN;QACF;QACA,IAAII,YAAY;YACdF,SAASE;QACX,OAAO,IAAIH,gBAAgB;YACzBC,SAASD;QACX;IACF,GAAG;QAACD;QAAII;QAAYF;QAAUD;KAAe;IAE7C,OAAO;AACT,EAAC"}
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ export declare const ExportListMenuItem: React.FC<{
3
+ collectionSlug: string;
4
+ exportCollectionSlug: string;
5
+ }>;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ExportListMenuItem/index.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAoB,MAAM,OAAO,CAAA;AAWxC,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC;IACxC,cAAc,EAAE,MAAM,CAAA;IACtB,oBAAoB,EAAE,MAAM,CAAA;CAC7B,CAoCA,CAAA"}
@@ -0,0 +1,44 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { getTranslation } from '@ruya.sa/translations';
4
+ import { PopupList, Translation, useConfig, useDocumentDrawer, useTranslation } from '@ruya.sa/ui';
5
+ import React, { useEffect } from 'react';
6
+ import { useImportExport } from '../ImportExportProvider/index.js';
7
+ const baseClass = 'export-list-menu-item';
8
+ export const ExportListMenuItem = ({ collectionSlug, exportCollectionSlug })=>{
9
+ const { getEntityConfig } = useConfig();
10
+ const { i18n, t } = useTranslation();
11
+ const currentCollectionConfig = getEntityConfig({
12
+ collectionSlug
13
+ });
14
+ const [DocumentDrawer, DocumentDrawerToggler] = useDocumentDrawer({
15
+ collectionSlug: exportCollectionSlug
16
+ });
17
+ const { setCollection } = useImportExport();
18
+ // Set collection and selected items on mount or when selection changes
19
+ useEffect(()=>{
20
+ setCollection(currentCollectionConfig.slug ?? '');
21
+ }, [
22
+ currentCollectionConfig,
23
+ setCollection
24
+ ]);
25
+ return /*#__PURE__*/ _jsxs(PopupList.Button, {
26
+ className: baseClass,
27
+ children: [
28
+ /*#__PURE__*/ _jsx(DocumentDrawerToggler, {
29
+ children: /*#__PURE__*/ _jsx(Translation, {
30
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
31
+ // @ts-expect-error
32
+ i18nKey: "plugin-import-export:exportDocumentLabel",
33
+ t: t,
34
+ variables: {
35
+ label: getTranslation(currentCollectionConfig.labels.plural, i18n)
36
+ }
37
+ })
38
+ }),
39
+ /*#__PURE__*/ _jsx(DocumentDrawer, {})
40
+ ]
41
+ });
42
+ };
43
+
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/ExportListMenuItem/index.tsx"],"sourcesContent":["'use client'\n\nimport { getTranslation } from '@ruya.sa/translations'\nimport {\n PopupList,\n Translation,\n useConfig,\n useDocumentDrawer,\n useDocumentInfo,\n useTranslation,\n} from '@ruya.sa/ui'\nimport React, { useEffect } from 'react'\n\nimport type {\n PluginImportExportTranslationKeys,\n PluginImportExportTranslations,\n} from '../../translations/index.js'\n\nimport { useImportExport } from '../ImportExportProvider/index.js'\n\nconst baseClass = 'export-list-menu-item'\n\nexport const ExportListMenuItem: React.FC<{\n collectionSlug: string\n exportCollectionSlug: string\n}> = ({ collectionSlug, exportCollectionSlug }) => {\n const { getEntityConfig } = useConfig()\n\n const { i18n, t } = useTranslation<\n PluginImportExportTranslations,\n PluginImportExportTranslationKeys\n >()\n\n const currentCollectionConfig = getEntityConfig({ collectionSlug })\n\n const [DocumentDrawer, DocumentDrawerToggler] = useDocumentDrawer({\n collectionSlug: exportCollectionSlug,\n })\n const { setCollection } = useImportExport()\n\n // Set collection and selected items on mount or when selection changes\n useEffect(() => {\n setCollection(currentCollectionConfig.slug ?? '')\n }, [currentCollectionConfig, setCollection])\n\n return (\n <PopupList.Button className={baseClass}>\n <DocumentDrawerToggler>\n <Translation\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n i18nKey=\"plugin-import-export:exportDocumentLabel\"\n t={t}\n variables={{\n label: getTranslation(currentCollectionConfig.labels.plural, i18n),\n }}\n />\n </DocumentDrawerToggler>\n <DocumentDrawer />\n </PopupList.Button>\n )\n}\n"],"names":["getTranslation","PopupList","Translation","useConfig","useDocumentDrawer","useTranslation","React","useEffect","useImportExport","baseClass","ExportListMenuItem","collectionSlug","exportCollectionSlug","getEntityConfig","i18n","t","currentCollectionConfig","DocumentDrawer","DocumentDrawerToggler","setCollection","slug","Button","className","i18nKey","variables","label","labels","plural"],"mappings":"AAAA;;AAEA,SAASA,cAAc,QAAQ,wBAAuB;AACtD,SACEC,SAAS,EACTC,WAAW,EACXC,SAAS,EACTC,iBAAiB,EAEjBC,cAAc,QACT,cAAa;AACpB,OAAOC,SAASC,SAAS,QAAQ,QAAO;AAOxC,SAASC,eAAe,QAAQ,mCAAkC;AAElE,MAAMC,YAAY;AAElB,OAAO,MAAMC,qBAGR,CAAC,EAAEC,cAAc,EAAEC,oBAAoB,EAAE;IAC5C,MAAM,EAAEC,eAAe,EAAE,GAAGV;IAE5B,MAAM,EAAEW,IAAI,EAAEC,CAAC,EAAE,GAAGV;IAKpB,MAAMW,0BAA0BH,gBAAgB;QAAEF;IAAe;IAEjE,MAAM,CAACM,gBAAgBC,sBAAsB,GAAGd,kBAAkB;QAChEO,gBAAgBC;IAClB;IACA,MAAM,EAAEO,aAAa,EAAE,GAAGX;IAE1B,uEAAuE;IACvED,UAAU;QACRY,cAAcH,wBAAwBI,IAAI,IAAI;IAChD,GAAG;QAACJ;QAAyBG;KAAc;IAE3C,qBACE,MAAClB,UAAUoB,MAAM;QAACC,WAAWb;;0BAC3B,KAACS;0BACC,cAAA,KAAChB;oBACC,6DAA6D;oBAC7D,mBAAmB;oBACnBqB,SAAQ;oBACRR,GAAGA;oBACHS,WAAW;wBACTC,OAAOzB,eAAegB,wBAAwBU,MAAM,CAACC,MAAM,EAAEb;oBAC/D;;;0BAGJ,KAACG;;;AAGP,EAAC"}
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import './index.scss';
3
+ export declare const ExportPreview: React.FC;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ExportPreview/index.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAqD,MAAM,OAAO,CAAA;AASzE,OAAO,cAAc,CAAA;AAKrB,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EA8PjC,CAAA"}
@@ -0,0 +1,252 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { getTranslation } from '@ruya.sa/translations';
4
+ import { CodeEditorLazy, Pagination, PerPage, Table, Translation, useConfig, useDebouncedEffect, useDocumentInfo, useFormFields, useTranslation } from '@ruya.sa/ui';
5
+ import React, { useEffect, useRef, useState, useTransition } from 'react';
6
+ import { DEFAULT_PREVIEW_LIMIT, PREVIEW_LIMIT_OPTIONS } from '../../constants.js';
7
+ import './index.scss';
8
+ import { useImportExport } from '../ImportExportProvider/index.js';
9
+ const baseClass = 'export-preview';
10
+ export const ExportPreview = ()=>{
11
+ const [isPending, startTransition] = useTransition();
12
+ const { collection } = useImportExport();
13
+ const { config, config: { routes } } = useConfig();
14
+ const { collectionSlug } = useDocumentInfo();
15
+ const { draft, fields, format, limit, locale, sort, where } = useFormFields(([fields])=>{
16
+ return {
17
+ draft: fields['drafts']?.value,
18
+ fields: fields['fields']?.value,
19
+ format: fields['format']?.value,
20
+ limit: fields['limit']?.value,
21
+ locale: fields['locale']?.value,
22
+ sort: fields['sort']?.value,
23
+ where: fields['where']?.value
24
+ };
25
+ });
26
+ const [dataToRender, setDataToRender] = useState([]);
27
+ const [exportTotalDocs, setExportTotalDocs] = useState(0);
28
+ const [columns, setColumns] = useState([]);
29
+ const { i18n, t } = useTranslation();
30
+ // Preview pagination state (separate from export config)
31
+ const [previewPage, setPreviewPage] = useState(1);
32
+ const [previewLimit, setPreviewLimit] = useState(DEFAULT_PREVIEW_LIMIT);
33
+ const [paginationData, setPaginationData] = useState(null);
34
+ // Track previous export config to reset preview page when it changes
35
+ const prevExportConfigRef = useRef({
36
+ draft,
37
+ fields,
38
+ format,
39
+ limit,
40
+ locale,
41
+ sort,
42
+ where
43
+ });
44
+ // Reset preview page when export config changes
45
+ useEffect(()=>{
46
+ const prevConfig = prevExportConfigRef.current;
47
+ const configChanged = prevConfig.draft !== draft || prevConfig.limit !== limit || prevConfig.locale !== locale || prevConfig.sort !== sort || JSON.stringify(prevConfig.fields) !== JSON.stringify(fields) || JSON.stringify(prevConfig.where) !== JSON.stringify(where);
48
+ if (configChanged) {
49
+ setPreviewPage(1);
50
+ prevExportConfigRef.current = {
51
+ draft,
52
+ fields,
53
+ format,
54
+ limit,
55
+ locale,
56
+ sort,
57
+ where
58
+ };
59
+ }
60
+ }, [
61
+ draft,
62
+ fields,
63
+ format,
64
+ limit,
65
+ locale,
66
+ sort,
67
+ where
68
+ ]);
69
+ const targetCollectionSlug = typeof collection === 'string' && collection;
70
+ const isCSV = format === 'csv';
71
+ useDebouncedEffect(()=>{
72
+ if (!collectionSlug || !targetCollectionSlug) {
73
+ return;
74
+ }
75
+ const abortController = new AbortController();
76
+ const fetchData = async ()=>{
77
+ try {
78
+ const res = await fetch(`${routes.api}/${collectionSlug}/export-preview`, {
79
+ body: JSON.stringify({
80
+ collectionSlug: targetCollectionSlug,
81
+ draft,
82
+ fields,
83
+ format,
84
+ limit,
85
+ locale,
86
+ previewLimit,
87
+ previewPage,
88
+ sort,
89
+ where
90
+ }),
91
+ credentials: 'include',
92
+ headers: {
93
+ 'Content-Type': 'application/json'
94
+ },
95
+ method: 'POST',
96
+ signal: abortController.signal
97
+ });
98
+ if (!res.ok) {
99
+ return;
100
+ }
101
+ const { columns: serverColumns, docs, exportTotalDocs: serverExportTotalDocs, hasNextPage, hasPrevPage, limit: responseLimit, page: responsePage, totalPages } = await res.json();
102
+ // For CSV: use server-provided columns (from getSchemaColumns) for consistent ordering
103
+ // For JSON: derive keys from docs
104
+ const allKeys = Array.from(new Set(docs.flatMap((doc)=>Object.keys(doc))));
105
+ // Use server columns if available (CSV format), otherwise fall back to data-derived keys
106
+ const fieldKeys = serverColumns && serverColumns.length > 0 ? serverColumns : allKeys;
107
+ // Build columns based on field keys
108
+ const newColumns = fieldKeys.map((key)=>({
109
+ accessor: key,
110
+ active: true,
111
+ field: {
112
+ name: key
113
+ },
114
+ Heading: getTranslation(key, i18n),
115
+ renderedCells: docs.map((doc)=>{
116
+ const val = doc[key];
117
+ if (val === undefined || val === null) {
118
+ return null;
119
+ }
120
+ // Avoid ESLint warning by type-checking before calling String()
121
+ if (typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean') {
122
+ return String(val);
123
+ }
124
+ if (Array.isArray(val)) {
125
+ return val.map(String).join(', ');
126
+ }
127
+ return JSON.stringify(val);
128
+ })
129
+ }));
130
+ setExportTotalDocs(serverExportTotalDocs);
131
+ setPaginationData({
132
+ hasNextPage,
133
+ hasPrevPage,
134
+ limit: responseLimit,
135
+ nextPage: responsePage + 1,
136
+ page: responsePage,
137
+ prevPage: responsePage - 1,
138
+ totalPages
139
+ });
140
+ setColumns(newColumns);
141
+ setDataToRender(docs);
142
+ } catch (error) {
143
+ console.error('Error fetching preview data:', error);
144
+ }
145
+ };
146
+ startTransition(async ()=>await fetchData());
147
+ return ()=>{
148
+ if (!abortController.signal.aborted) {
149
+ abortController.abort('Component unmounted');
150
+ }
151
+ };
152
+ }, [
153
+ collectionSlug,
154
+ draft,
155
+ fields,
156
+ format,
157
+ i18n,
158
+ limit,
159
+ locale,
160
+ previewLimit,
161
+ previewPage,
162
+ sort,
163
+ where,
164
+ routes.api,
165
+ targetCollectionSlug
166
+ ], 500);
167
+ const handlePageChange = (page)=>{
168
+ setPreviewPage(page);
169
+ };
170
+ const handlePerPageChange = (newLimit)=>{
171
+ setPreviewLimit(newLimit);
172
+ setPreviewPage(1);
173
+ };
174
+ return /*#__PURE__*/ _jsxs("div", {
175
+ className: baseClass,
176
+ children: [
177
+ /*#__PURE__*/ _jsxs("div", {
178
+ className: `${baseClass}__header`,
179
+ children: [
180
+ /*#__PURE__*/ _jsx("h3", {
181
+ children: /*#__PURE__*/ _jsx(Translation, {
182
+ i18nKey: "version:preview",
183
+ t: t
184
+ })
185
+ }),
186
+ exportTotalDocs > 0 && !isPending && /*#__PURE__*/ _jsx("span", {
187
+ className: `${baseClass}__export-count`,
188
+ children: /*#__PURE__*/ _jsx(Translation, {
189
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
190
+ // @ts-expect-error
191
+ i18nKey: "plugin-import-export:documentsToExport",
192
+ t: t,
193
+ variables: {
194
+ count: exportTotalDocs
195
+ }
196
+ })
197
+ })
198
+ ]
199
+ }),
200
+ isPending && !dataToRender && /*#__PURE__*/ _jsx("div", {
201
+ className: `${baseClass}__loading`,
202
+ children: /*#__PURE__*/ _jsx(Translation, {
203
+ i18nKey: "general:loading",
204
+ t: t
205
+ })
206
+ }),
207
+ dataToRender && (isCSV ? /*#__PURE__*/ _jsx(Table, {
208
+ columns: columns,
209
+ data: dataToRender
210
+ }) : /*#__PURE__*/ _jsx(CodeEditorLazy, {
211
+ language: "json",
212
+ readOnly: true,
213
+ value: JSON.stringify(dataToRender, null, 2)
214
+ })),
215
+ paginationData && exportTotalDocs > 0 && /*#__PURE__*/ _jsxs("div", {
216
+ className: `${baseClass}__pagination`,
217
+ children: [
218
+ paginationData.totalPages > 1 && /*#__PURE__*/ _jsx(Pagination, {
219
+ hasNextPage: paginationData.hasNextPage,
220
+ hasPrevPage: paginationData.hasPrevPage,
221
+ nextPage: paginationData.nextPage ?? undefined,
222
+ numberOfNeighbors: 1,
223
+ onChange: handlePageChange,
224
+ page: paginationData.page,
225
+ prevPage: paginationData.prevPage ?? undefined,
226
+ totalPages: paginationData.totalPages
227
+ }),
228
+ /*#__PURE__*/ _jsx("span", {
229
+ className: `${baseClass}__page-info`,
230
+ children: /*#__PURE__*/ _jsx(Translation, {
231
+ // @ts-expect-error - plugin translations not typed
232
+ i18nKey: "plugin-import-export:previewPageInfo",
233
+ t: t,
234
+ variables: {
235
+ end: Math.min((paginationData.page ?? 1) * previewLimit, exportTotalDocs),
236
+ start: ((paginationData.page ?? 1) - 1) * previewLimit + 1,
237
+ total: exportTotalDocs
238
+ }
239
+ })
240
+ }),
241
+ /*#__PURE__*/ _jsx(PerPage, {
242
+ handleChange: handlePerPageChange,
243
+ limit: previewLimit,
244
+ limits: PREVIEW_LIMIT_OPTIONS
245
+ })
246
+ ]
247
+ })
248
+ ]
249
+ });
250
+ };
251
+
252
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/ExportPreview/index.tsx"],"sourcesContent":["'use client'\nimport type { Column } from '@ruya.sa/ui'\nimport type { ClientField, PaginatedDocs, Where } from '@ruya.sa/payload'\n\nimport { getTranslation } from '@ruya.sa/translations'\nimport {\n CodeEditorLazy,\n Pagination,\n PerPage,\n Table,\n Translation,\n useConfig,\n useDebouncedEffect,\n useDocumentInfo,\n useFormFields,\n useTranslation,\n} from '@ruya.sa/ui'\nimport React, { useEffect, useRef, useState, useTransition } from 'react'\n\nimport type {\n PluginImportExportTranslationKeys,\n PluginImportExportTranslations,\n} from '../../translations/index.js'\nimport type { ExportPreviewResponse } from '../../types.js'\n\nimport { DEFAULT_PREVIEW_LIMIT, PREVIEW_LIMIT_OPTIONS } from '../../constants.js'\nimport './index.scss'\nimport { useImportExport } from '../ImportExportProvider/index.js'\n\nconst baseClass = 'export-preview'\n\nexport const ExportPreview: React.FC = () => {\n const [isPending, startTransition] = useTransition()\n const { collection } = useImportExport()\n const {\n config,\n config: { routes },\n } = useConfig()\n const { collectionSlug } = useDocumentInfo()\n const { draft, fields, format, limit, locale, sort, where } = useFormFields(([fields]) => {\n return {\n draft: fields['drafts']?.value,\n fields: fields['fields']?.value,\n format: fields['format']?.value,\n limit: fields['limit']?.value as number,\n locale: fields['locale']?.value as string,\n sort: fields['sort']?.value as string,\n where: fields['where']?.value as Where,\n }\n })\n const [dataToRender, setDataToRender] = useState<any[]>([])\n const [exportTotalDocs, setExportTotalDocs] = useState<number>(0)\n const [columns, setColumns] = useState<Column[]>([])\n const { i18n, t } = useTranslation<\n PluginImportExportTranslations,\n PluginImportExportTranslationKeys\n >()\n\n // Preview pagination state (separate from export config)\n const [previewPage, setPreviewPage] = useState(1)\n const [previewLimit, setPreviewLimit] = useState(DEFAULT_PREVIEW_LIMIT)\n const [paginationData, setPaginationData] = useState<null | Pick<\n PaginatedDocs,\n 'hasNextPage' | 'hasPrevPage' | 'limit' | 'nextPage' | 'page' | 'prevPage' | 'totalPages'\n >>(null)\n\n // Track previous export config to reset preview page when it changes\n const prevExportConfigRef = useRef({ draft, fields, format, limit, locale, sort, where })\n\n // Reset preview page when export config changes\n useEffect(() => {\n const prevConfig = prevExportConfigRef.current\n const configChanged =\n prevConfig.draft !== draft ||\n prevConfig.limit !== limit ||\n prevConfig.locale !== locale ||\n prevConfig.sort !== sort ||\n JSON.stringify(prevConfig.fields) !== JSON.stringify(fields) ||\n JSON.stringify(prevConfig.where) !== JSON.stringify(where)\n\n if (configChanged) {\n setPreviewPage(1)\n prevExportConfigRef.current = { draft, fields, format, limit, locale, sort, where }\n }\n }, [draft, fields, format, limit, locale, sort, where])\n\n const targetCollectionSlug = typeof collection === 'string' && collection\n\n const isCSV = format === 'csv'\n\n useDebouncedEffect(\n () => {\n if (!collectionSlug || !targetCollectionSlug) {\n return\n }\n\n const abortController = new AbortController()\n\n const fetchData = async () => {\n try {\n const res = await fetch(`${routes.api}/${collectionSlug}/export-preview`, {\n body: JSON.stringify({\n collectionSlug: targetCollectionSlug,\n draft,\n fields,\n format,\n limit,\n locale,\n previewLimit,\n previewPage,\n sort,\n where,\n }),\n credentials: 'include',\n headers: { 'Content-Type': 'application/json' },\n method: 'POST',\n signal: abortController.signal,\n })\n\n if (!res.ok) {\n return\n }\n\n const {\n columns: serverColumns,\n docs,\n exportTotalDocs: serverExportTotalDocs,\n hasNextPage,\n hasPrevPage,\n limit: responseLimit,\n page: responsePage,\n totalPages,\n }: ExportPreviewResponse = await res.json()\n\n // For CSV: use server-provided columns (from getSchemaColumns) for consistent ordering\n // For JSON: derive keys from docs\n const allKeys = Array.from(new Set(docs.flatMap((doc) => Object.keys(doc))))\n\n // Use server columns if available (CSV format), otherwise fall back to data-derived keys\n const fieldKeys = serverColumns && serverColumns.length > 0 ? serverColumns : allKeys\n\n // Build columns based on field keys\n const newColumns: Column[] = fieldKeys.map((key) => ({\n accessor: key,\n active: true,\n field: { name: key } as ClientField,\n Heading: getTranslation(key, i18n),\n renderedCells: docs.map((doc: Record<string, unknown>) => {\n const val = doc[key]\n\n if (val === undefined || val === null) {\n return null\n }\n\n // Avoid ESLint warning by type-checking before calling String()\n if (typeof val === 'string' || typeof val === 'number' || typeof val === 'boolean') {\n return String(val)\n }\n\n if (Array.isArray(val)) {\n return val.map(String).join(', ')\n }\n\n return JSON.stringify(val)\n }),\n }))\n\n setExportTotalDocs(serverExportTotalDocs)\n setPaginationData({\n hasNextPage,\n hasPrevPage,\n limit: responseLimit,\n nextPage: responsePage + 1,\n page: responsePage,\n prevPage: responsePage - 1,\n totalPages,\n })\n setColumns(newColumns)\n setDataToRender(docs)\n } catch (error) {\n console.error('Error fetching preview data:', error)\n }\n }\n\n startTransition(async () => await fetchData())\n\n return () => {\n if (!abortController.signal.aborted) {\n abortController.abort('Component unmounted')\n }\n }\n },\n [\n collectionSlug,\n draft,\n fields,\n format,\n i18n,\n limit,\n locale,\n previewLimit,\n previewPage,\n sort,\n where,\n routes.api,\n targetCollectionSlug,\n ],\n 500,\n )\n\n const handlePageChange = (page: number) => {\n setPreviewPage(page)\n }\n\n const handlePerPageChange = (newLimit: number) => {\n setPreviewLimit(newLimit)\n setPreviewPage(1)\n }\n\n return (\n <div className={baseClass}>\n <div className={`${baseClass}__header`}>\n <h3>\n <Translation i18nKey=\"version:preview\" t={t} />\n </h3>\n {exportTotalDocs > 0 && !isPending && (\n <span className={`${baseClass}__export-count`}>\n <Translation\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n i18nKey=\"plugin-import-export:documentsToExport\"\n t={t}\n variables={{\n count: exportTotalDocs,\n }}\n />\n </span>\n )}\n </div>\n {isPending && !dataToRender && (\n <div className={`${baseClass}__loading`}>\n <Translation i18nKey=\"general:loading\" t={t} />\n </div>\n )}\n {dataToRender &&\n (isCSV ? (\n <Table columns={columns} data={dataToRender} />\n ) : (\n <CodeEditorLazy language=\"json\" readOnly value={JSON.stringify(dataToRender, null, 2)} />\n ))}\n {paginationData && exportTotalDocs > 0 && (\n <div className={`${baseClass}__pagination`}>\n {paginationData.totalPages > 1 && (\n <Pagination\n hasNextPage={paginationData.hasNextPage}\n hasPrevPage={paginationData.hasPrevPage}\n nextPage={paginationData.nextPage ?? undefined}\n numberOfNeighbors={1}\n onChange={handlePageChange}\n page={paginationData.page}\n prevPage={paginationData.prevPage ?? undefined}\n totalPages={paginationData.totalPages}\n />\n )}\n <span className={`${baseClass}__page-info`}>\n <Translation\n // @ts-expect-error - plugin translations not typed\n i18nKey=\"plugin-import-export:previewPageInfo\"\n t={t}\n variables={{\n end: Math.min((paginationData.page ?? 1) * previewLimit, exportTotalDocs),\n start: ((paginationData.page ?? 1) - 1) * previewLimit + 1,\n total: exportTotalDocs,\n }}\n />\n </span>\n <PerPage\n handleChange={handlePerPageChange}\n limit={previewLimit}\n limits={PREVIEW_LIMIT_OPTIONS}\n />\n </div>\n )}\n </div>\n )\n}\n"],"names":["getTranslation","CodeEditorLazy","Pagination","PerPage","Table","Translation","useConfig","useDebouncedEffect","useDocumentInfo","useFormFields","useTranslation","React","useEffect","useRef","useState","useTransition","DEFAULT_PREVIEW_LIMIT","PREVIEW_LIMIT_OPTIONS","useImportExport","baseClass","ExportPreview","isPending","startTransition","collection","config","routes","collectionSlug","draft","fields","format","limit","locale","sort","where","value","dataToRender","setDataToRender","exportTotalDocs","setExportTotalDocs","columns","setColumns","i18n","t","previewPage","setPreviewPage","previewLimit","setPreviewLimit","paginationData","setPaginationData","prevExportConfigRef","prevConfig","current","configChanged","JSON","stringify","targetCollectionSlug","isCSV","abortController","AbortController","fetchData","res","fetch","api","body","credentials","headers","method","signal","ok","serverColumns","docs","serverExportTotalDocs","hasNextPage","hasPrevPage","responseLimit","page","responsePage","totalPages","json","allKeys","Array","from","Set","flatMap","doc","Object","keys","fieldKeys","length","newColumns","map","key","accessor","active","field","name","Heading","renderedCells","val","undefined","String","isArray","join","nextPage","prevPage","error","console","aborted","abort","handlePageChange","handlePerPageChange","newLimit","div","className","h3","i18nKey","span","variables","count","data","language","readOnly","numberOfNeighbors","onChange","end","Math","min","start","total","handleChange","limits"],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ @layer payload-default {
2
+ .export-preview {
3
+ &__header {
4
+ display: flex;
5
+ justify-content: space-between;
6
+ align-items: flex-end;
7
+ margin-bottom: 10px;
8
+ }
9
+
10
+ &__export-count {
11
+ font-size: var(--font-size-small);
12
+ color: var(--theme-elevation-500);
13
+ }
14
+
15
+ &__pagination {
16
+ display: flex;
17
+ align-items: center;
18
+ justify-content: space-between;
19
+ gap: var(--base);
20
+ margin-top: var(--base);
21
+ padding-top: var(--base);
22
+ border-top: 1px solid var(--theme-elevation-100);
23
+
24
+ // When only PerPage is present (no Pagination), keep it on the right
25
+ .per-page:only-child {
26
+ margin-left: auto;
27
+ }
28
+ }
29
+
30
+ &__page-info {
31
+ font-size: var(--font-size-small);
32
+ color: var(--theme-elevation-500);
33
+ white-space: nowrap;
34
+ }
35
+ }
36
+ }
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ export declare const ExportSaveButton: React.FC;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ExportSaveButton/index.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,MAAM,OAAO,CAAA;AAOzB,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EA+GpC,CAAA"}
@@ -0,0 +1,110 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Button, SaveButton, toast, Translation, useConfig, useForm, useFormModified, useTranslation } from '@ruya.sa/ui';
4
+ import { formatAdminURL } from '@ruya.sa/payload/shared';
5
+ import React from 'react';
6
+ export const ExportSaveButton = ()=>{
7
+ const { t } = useTranslation();
8
+ const { config: { routes: { api } }, getEntityConfig } = useConfig();
9
+ const { getData, setModified } = useForm();
10
+ const modified = useFormModified();
11
+ const exportsCollectionConfig = getEntityConfig({
12
+ collectionSlug: 'exports'
13
+ });
14
+ const disableSave = exportsCollectionConfig?.admin?.custom?.disableSave === true;
15
+ const disableDownload = exportsCollectionConfig?.admin?.custom?.disableDownload === true;
16
+ const label = t('general:save');
17
+ const handleDownload = async ()=>{
18
+ let timeoutID = null;
19
+ let toastID = null;
20
+ try {
21
+ setModified(false); // Reset modified state
22
+ const data = getData();
23
+ // Set a timeout to show toast if the request takes longer than 200ms
24
+ timeoutID = setTimeout(()=>{
25
+ toastID = toast.success('Your export is being processed...');
26
+ }, 200);
27
+ const response = await fetch(formatAdminURL({
28
+ apiRoute: api,
29
+ path: '/exports/download'
30
+ }), {
31
+ body: JSON.stringify({
32
+ data
33
+ }),
34
+ credentials: 'include',
35
+ headers: {
36
+ 'Content-Type': 'application/json'
37
+ },
38
+ method: 'POST'
39
+ });
40
+ // Clear the timeout if fetch completes quickly
41
+ if (timeoutID) {
42
+ clearTimeout(timeoutID);
43
+ }
44
+ // Dismiss the toast if it was shown
45
+ if (toastID) {
46
+ toast.dismiss(toastID);
47
+ }
48
+ if (!response.ok) {
49
+ // Try to parse the error message from the JSON response
50
+ let errorMsg = 'Failed to download file';
51
+ try {
52
+ const errorJson = await response.json();
53
+ if (errorJson?.errors?.[0]?.message) {
54
+ errorMsg = errorJson.errors[0].message;
55
+ }
56
+ } catch {
57
+ // Ignore JSON parse errors, fallback to generic message
58
+ }
59
+ throw new Error(errorMsg);
60
+ }
61
+ const fileStream = response.body;
62
+ const reader = fileStream?.getReader();
63
+ const decoder = new TextDecoder();
64
+ let result = '';
65
+ while(reader){
66
+ const { done, value } = await reader.read();
67
+ if (done) {
68
+ break;
69
+ }
70
+ result += decoder.decode(value, {
71
+ stream: true
72
+ });
73
+ }
74
+ const blob = new Blob([
75
+ result
76
+ ], {
77
+ type: 'text/plain'
78
+ });
79
+ const url = URL.createObjectURL(blob);
80
+ const a = document.createElement('a');
81
+ a.href = url;
82
+ a.download = `${data.name}.${data.format}`;
83
+ document.body.appendChild(a);
84
+ a.click();
85
+ document.body.removeChild(a);
86
+ URL.revokeObjectURL(url);
87
+ } catch (error) {
88
+ toast.error(error.message || 'Error downloading file');
89
+ }
90
+ };
91
+ return /*#__PURE__*/ _jsxs(React.Fragment, {
92
+ children: [
93
+ !disableSave && /*#__PURE__*/ _jsx(SaveButton, {
94
+ label: label
95
+ }),
96
+ !disableDownload && /*#__PURE__*/ _jsx(Button, {
97
+ disabled: !modified,
98
+ onClick: handleDownload,
99
+ size: "medium",
100
+ type: "button",
101
+ children: /*#__PURE__*/ _jsx(Translation, {
102
+ i18nKey: "upload:download",
103
+ t: t
104
+ })
105
+ })
106
+ ]
107
+ });
108
+ };
109
+
110
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/ExportSaveButton/index.tsx"],"sourcesContent":["'use client'\n\nimport {\n Button,\n SaveButton,\n toast,\n Translation,\n useConfig,\n useForm,\n useFormModified,\n useTranslation,\n} from '@ruya.sa/ui'\nimport { formatAdminURL } from '@ruya.sa/payload/shared'\nimport React from 'react'\n\nimport type {\n PluginImportExportTranslationKeys,\n PluginImportExportTranslations,\n} from '../../translations/index.js'\n\nexport const ExportSaveButton: React.FC = () => {\n const { t } = useTranslation<PluginImportExportTranslations, PluginImportExportTranslationKeys>()\n const {\n config: {\n routes: { api },\n },\n getEntityConfig,\n } = useConfig()\n\n const { getData, setModified } = useForm()\n const modified = useFormModified()\n\n const exportsCollectionConfig = getEntityConfig({ collectionSlug: 'exports' })\n\n const disableSave = exportsCollectionConfig?.admin?.custom?.disableSave === true\n\n const disableDownload = exportsCollectionConfig?.admin?.custom?.disableDownload === true\n\n const label = t('general:save')\n\n const handleDownload = async () => {\n let timeoutID: null | ReturnType<typeof setTimeout> = null\n let toastID: null | number | string = null\n\n try {\n setModified(false) // Reset modified state\n const data = getData()\n\n // Set a timeout to show toast if the request takes longer than 200ms\n timeoutID = setTimeout(() => {\n toastID = toast.success('Your export is being processed...')\n }, 200)\n\n const response = await fetch(\n formatAdminURL({\n apiRoute: api,\n path: '/exports/download',\n }),\n {\n body: JSON.stringify({\n data,\n }),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n },\n )\n\n // Clear the timeout if fetch completes quickly\n if (timeoutID) {\n clearTimeout(timeoutID)\n }\n\n // Dismiss the toast if it was shown\n if (toastID) {\n toast.dismiss(toastID)\n }\n\n if (!response.ok) {\n // Try to parse the error message from the JSON response\n let errorMsg = 'Failed to download file'\n try {\n const errorJson = await response.json()\n if (errorJson?.errors?.[0]?.message) {\n errorMsg = errorJson.errors[0].message\n }\n } catch {\n // Ignore JSON parse errors, fallback to generic message\n }\n throw new Error(errorMsg)\n }\n\n const fileStream = response.body\n const reader = fileStream?.getReader()\n const decoder = new TextDecoder()\n let result = ''\n\n while (reader) {\n const { done, value } = await reader.read()\n if (done) {\n break\n }\n result += decoder.decode(value, { stream: true })\n }\n\n const blob = new Blob([result], { type: 'text/plain' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = `${data.name}.${data.format}`\n document.body.appendChild(a)\n a.click()\n document.body.removeChild(a)\n URL.revokeObjectURL(url)\n } catch (error: any) {\n toast.error(error.message || 'Error downloading file')\n }\n }\n\n return (\n <React.Fragment>\n {!disableSave && <SaveButton label={label} />}\n {!disableDownload && (\n <Button disabled={!modified} onClick={handleDownload} size=\"medium\" type=\"button\">\n <Translation i18nKey=\"upload:download\" t={t} />\n </Button>\n )}\n </React.Fragment>\n )\n}\n"],"names":["Button","SaveButton","toast","Translation","useConfig","useForm","useFormModified","useTranslation","formatAdminURL","React","ExportSaveButton","t","config","routes","api","getEntityConfig","getData","setModified","modified","exportsCollectionConfig","collectionSlug","disableSave","admin","custom","disableDownload","label","handleDownload","timeoutID","toastID","data","setTimeout","success","response","fetch","apiRoute","path","body","JSON","stringify","credentials","headers","method","clearTimeout","dismiss","ok","errorMsg","errorJson","json","errors","message","Error","fileStream","reader","getReader","decoder","TextDecoder","result","done","value","read","decode","stream","blob","Blob","type","url","URL","createObjectURL","a","document","createElement","href","download","name","format","appendChild","click","removeChild","revokeObjectURL","error","Fragment","disabled","onClick","size","i18nKey"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { SelectFieldClientComponent } from '@ruya.sa/payload';
2
+ export declare const FieldsToExport: SelectFieldClientComponent;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/FieldsToExport/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAA;AAkBlE,eAAO,MAAM,cAAc,EAAE,0BA2E5B,CAAA"}