@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.
- package/README.md +7 -0
- package/dist/components/CollectionField/index.d.ts +3 -0
- package/dist/components/CollectionField/index.d.ts.map +1 -0
- package/dist/components/CollectionField/index.js +29 -0
- package/dist/components/CollectionField/index.js.map +1 -0
- package/dist/components/ExportListMenuItem/index.d.ts +6 -0
- package/dist/components/ExportListMenuItem/index.d.ts.map +1 -0
- package/dist/components/ExportListMenuItem/index.js +44 -0
- package/dist/components/ExportListMenuItem/index.js.map +1 -0
- package/dist/components/ExportPreview/index.d.ts +4 -0
- package/dist/components/ExportPreview/index.d.ts.map +1 -0
- package/dist/components/ExportPreview/index.js +252 -0
- package/dist/components/ExportPreview/index.js.map +1 -0
- package/dist/components/ExportPreview/index.scss +36 -0
- package/dist/components/ExportSaveButton/index.d.ts +3 -0
- package/dist/components/ExportSaveButton/index.d.ts.map +1 -0
- package/dist/components/ExportSaveButton/index.js +110 -0
- package/dist/components/ExportSaveButton/index.js.map +1 -0
- package/dist/components/FieldsToExport/index.d.ts +3 -0
- package/dist/components/FieldsToExport/index.d.ts.map +1 -0
- package/dist/components/FieldsToExport/index.js +87 -0
- package/dist/components/FieldsToExport/index.js.map +1 -0
- package/dist/components/FieldsToExport/index.scss +0 -0
- package/dist/components/FieldsToExport/reduceFields.d.ts +13 -0
- package/dist/components/FieldsToExport/reduceFields.d.ts.map +1 -0
- package/dist/components/FieldsToExport/reduceFields.js +109 -0
- package/dist/components/FieldsToExport/reduceFields.js.map +1 -0
- package/dist/components/ImportCollectionField/index.d.ts +3 -0
- package/dist/components/ImportCollectionField/index.d.ts.map +1 -0
- package/dist/components/ImportCollectionField/index.js +17 -0
- package/dist/components/ImportCollectionField/index.js.map +1 -0
- package/dist/components/ImportExportProvider/index.d.ts +12 -0
- package/dist/components/ImportExportProvider/index.d.ts.map +1 -0
- package/dist/components/ImportExportProvider/index.js +20 -0
- package/dist/components/ImportExportProvider/index.js.map +1 -0
- package/dist/components/ImportListMenuItem/index.d.ts +6 -0
- package/dist/components/ImportListMenuItem/index.d.ts.map +1 -0
- package/dist/components/ImportListMenuItem/index.js +48 -0
- package/dist/components/ImportListMenuItem/index.js.map +1 -0
- package/dist/components/ImportPreview/index.d.ts +4 -0
- package/dist/components/ImportPreview/index.d.ts.map +1 -0
- package/dist/components/ImportPreview/index.js +624 -0
- package/dist/components/ImportPreview/index.js.map +1 -0
- package/dist/components/ImportPreview/index.scss +41 -0
- package/dist/components/ImportSaveButton/index.d.ts +2 -0
- package/dist/components/ImportSaveButton/index.d.ts.map +1 -0
- package/dist/components/ImportSaveButton/index.js +18 -0
- package/dist/components/ImportSaveButton/index.js.map +1 -0
- package/dist/components/Page/index.d.ts +4 -0
- package/dist/components/Page/index.d.ts.map +1 -0
- package/dist/components/Page/index.js +40 -0
- package/dist/components/Page/index.js.map +1 -0
- package/dist/components/Page/index.scss +5 -0
- package/dist/components/SelectionToUseField/index.d.ts +3 -0
- package/dist/components/SelectionToUseField/index.d.ts.map +1 -0
- package/dist/components/SelectionToUseField/index.js +128 -0
- package/dist/components/SelectionToUseField/index.js.map +1 -0
- package/dist/components/SortBy/index.d.ts +4 -0
- package/dist/components/SortBy/index.d.ts.map +1 -0
- package/dist/components/SortBy/index.js +133 -0
- package/dist/components/SortBy/index.js.map +1 -0
- package/dist/components/SortBy/index.scss +3 -0
- package/dist/components/SortOrder/index.d.ts +4 -0
- package/dist/components/SortOrder/index.d.ts.map +1 -0
- package/dist/components/SortOrder/index.js +121 -0
- package/dist/components/SortOrder/index.js.map +1 -0
- package/dist/components/SortOrder/index.scss +3 -0
- package/dist/constants.d.ts +21 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +21 -0
- package/dist/constants.js.map +1 -0
- package/dist/export/batchProcessor.d.ts +107 -0
- package/dist/export/batchProcessor.d.ts.map +1 -0
- package/dist/export/batchProcessor.js +187 -0
- package/dist/export/batchProcessor.js.map +1 -0
- package/dist/export/createExport.d.ts +37 -0
- package/dist/export/createExport.d.ts.map +1 -0
- package/dist/export/createExport.js +385 -0
- package/dist/export/createExport.js.map +1 -0
- package/dist/export/getCreateExportCollectionTask.d.ts +16 -0
- package/dist/export/getCreateExportCollectionTask.d.ts.map +1 -0
- package/dist/export/getCreateExportCollectionTask.js +35 -0
- package/dist/export/getCreateExportCollectionTask.js.map +1 -0
- package/dist/export/getExportCollection.d.ts +8 -0
- package/dist/export/getExportCollection.d.ts.map +1 -0
- package/dist/export/getExportCollection.js +100 -0
- package/dist/export/getExportCollection.js.map +1 -0
- package/dist/export/getFields.d.ts +10 -0
- package/dist/export/getFields.d.ts.map +1 -0
- package/dist/export/getFields.js +244 -0
- package/dist/export/getFields.js.map +1 -0
- package/dist/export/handleDownload.d.ts +3 -0
- package/dist/export/handleDownload.d.ts.map +1 -0
- package/dist/export/handleDownload.js +42 -0
- package/dist/export/handleDownload.js.map +1 -0
- package/dist/export/handlePreview.d.ts +3 -0
- package/dist/export/handlePreview.d.ts.map +1 -0
- package/dist/export/handlePreview.js +163 -0
- package/dist/export/handlePreview.js.map +1 -0
- package/dist/exports/rsc.d.ts +15 -0
- package/dist/exports/rsc.d.ts.map +1 -0
- package/dist/exports/rsc.js +16 -0
- package/dist/exports/rsc.js.map +1 -0
- package/dist/exports/types.d.ts +2 -0
- package/dist/exports/types.d.ts.map +1 -0
- package/dist/exports/types.js +3 -0
- package/dist/exports/types.js.map +1 -0
- package/dist/import/batchProcessor.d.ts +46 -0
- package/dist/import/batchProcessor.d.ts.map +1 -0
- package/dist/import/batchProcessor.js +529 -0
- package/dist/import/batchProcessor.js.map +1 -0
- package/dist/import/createImport.d.ts +45 -0
- package/dist/import/createImport.d.ts.map +1 -0
- package/dist/import/createImport.js +175 -0
- package/dist/import/createImport.js.map +1 -0
- package/dist/import/getCreateImportCollectionTask.d.ts +13 -0
- package/dist/import/getCreateImportCollectionTask.d.ts.map +1 -0
- package/dist/import/getCreateImportCollectionTask.js +81 -0
- package/dist/import/getCreateImportCollectionTask.js.map +1 -0
- package/dist/import/getFields.d.ts +7 -0
- package/dist/import/getFields.d.ts.map +1 -0
- package/dist/import/getFields.js +150 -0
- package/dist/import/getFields.js.map +1 -0
- package/dist/import/getImportCollection.d.ts +8 -0
- package/dist/import/getImportCollection.d.ts.map +1 -0
- package/dist/import/getImportCollection.js +258 -0
- package/dist/import/getImportCollection.js.map +1 -0
- package/dist/import/handlePreview.d.ts +3 -0
- package/dist/import/handlePreview.d.ts.map +1 -0
- package/dist/import/handlePreview.js +94 -0
- package/dist/import/handlePreview.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +120 -0
- package/dist/index.js.map +1 -0
- package/dist/translations/index.d.ts +6 -0
- package/dist/translations/index.d.ts.map +1 -0
- package/dist/translations/index.js +84 -0
- package/dist/translations/index.js.map +1 -0
- package/dist/translations/languages/ar.d.ts +4 -0
- package/dist/translations/languages/ar.d.ts.map +1 -0
- package/dist/translations/languages/ar.js +48 -0
- package/dist/translations/languages/ar.js.map +1 -0
- package/dist/translations/languages/az.d.ts +4 -0
- package/dist/translations/languages/az.d.ts.map +1 -0
- package/dist/translations/languages/az.js +48 -0
- package/dist/translations/languages/az.js.map +1 -0
- package/dist/translations/languages/bg.d.ts +4 -0
- package/dist/translations/languages/bg.d.ts.map +1 -0
- package/dist/translations/languages/bg.js +48 -0
- package/dist/translations/languages/bg.js.map +1 -0
- package/dist/translations/languages/bnBd.d.ts +4 -0
- package/dist/translations/languages/bnBd.d.ts.map +1 -0
- package/dist/translations/languages/bnBd.js +48 -0
- package/dist/translations/languages/bnBd.js.map +1 -0
- package/dist/translations/languages/bnIn.d.ts +4 -0
- package/dist/translations/languages/bnIn.d.ts.map +1 -0
- package/dist/translations/languages/bnIn.js +48 -0
- package/dist/translations/languages/bnIn.js.map +1 -0
- package/dist/translations/languages/ca.d.ts +4 -0
- package/dist/translations/languages/ca.d.ts.map +1 -0
- package/dist/translations/languages/ca.js +48 -0
- package/dist/translations/languages/ca.js.map +1 -0
- package/dist/translations/languages/cs.d.ts +4 -0
- package/dist/translations/languages/cs.d.ts.map +1 -0
- package/dist/translations/languages/cs.js +48 -0
- package/dist/translations/languages/cs.js.map +1 -0
- package/dist/translations/languages/da.d.ts +4 -0
- package/dist/translations/languages/da.d.ts.map +1 -0
- package/dist/translations/languages/da.js +48 -0
- package/dist/translations/languages/da.js.map +1 -0
- package/dist/translations/languages/de.d.ts +4 -0
- package/dist/translations/languages/de.d.ts.map +1 -0
- package/dist/translations/languages/de.js +48 -0
- package/dist/translations/languages/de.js.map +1 -0
- package/dist/translations/languages/en.d.ts +45 -0
- package/dist/translations/languages/en.d.ts.map +1 -0
- package/dist/translations/languages/en.js +48 -0
- package/dist/translations/languages/en.js.map +1 -0
- package/dist/translations/languages/es.d.ts +4 -0
- package/dist/translations/languages/es.d.ts.map +1 -0
- package/dist/translations/languages/es.js +48 -0
- package/dist/translations/languages/es.js.map +1 -0
- package/dist/translations/languages/et.d.ts +4 -0
- package/dist/translations/languages/et.d.ts.map +1 -0
- package/dist/translations/languages/et.js +48 -0
- package/dist/translations/languages/et.js.map +1 -0
- package/dist/translations/languages/fa.d.ts +4 -0
- package/dist/translations/languages/fa.d.ts.map +1 -0
- package/dist/translations/languages/fa.js +48 -0
- package/dist/translations/languages/fa.js.map +1 -0
- package/dist/translations/languages/fr.d.ts +4 -0
- package/dist/translations/languages/fr.d.ts.map +1 -0
- package/dist/translations/languages/fr.js +48 -0
- package/dist/translations/languages/fr.js.map +1 -0
- package/dist/translations/languages/he.d.ts +4 -0
- package/dist/translations/languages/he.d.ts.map +1 -0
- package/dist/translations/languages/he.js +48 -0
- package/dist/translations/languages/he.js.map +1 -0
- package/dist/translations/languages/hr.d.ts +4 -0
- package/dist/translations/languages/hr.d.ts.map +1 -0
- package/dist/translations/languages/hr.js +48 -0
- package/dist/translations/languages/hr.js.map +1 -0
- package/dist/translations/languages/hu.d.ts +4 -0
- package/dist/translations/languages/hu.d.ts.map +1 -0
- package/dist/translations/languages/hu.js +48 -0
- package/dist/translations/languages/hu.js.map +1 -0
- package/dist/translations/languages/hy.d.ts +4 -0
- package/dist/translations/languages/hy.d.ts.map +1 -0
- package/dist/translations/languages/hy.js +48 -0
- package/dist/translations/languages/hy.js.map +1 -0
- package/dist/translations/languages/id.d.ts +4 -0
- package/dist/translations/languages/id.d.ts.map +1 -0
- package/dist/translations/languages/id.js +48 -0
- package/dist/translations/languages/id.js.map +1 -0
- package/dist/translations/languages/is.d.ts +4 -0
- package/dist/translations/languages/is.d.ts.map +1 -0
- package/dist/translations/languages/is.js +48 -0
- package/dist/translations/languages/is.js.map +1 -0
- package/dist/translations/languages/it.d.ts +4 -0
- package/dist/translations/languages/it.d.ts.map +1 -0
- package/dist/translations/languages/it.js +48 -0
- package/dist/translations/languages/it.js.map +1 -0
- package/dist/translations/languages/ja.d.ts +4 -0
- package/dist/translations/languages/ja.d.ts.map +1 -0
- package/dist/translations/languages/ja.js +48 -0
- package/dist/translations/languages/ja.js.map +1 -0
- package/dist/translations/languages/ko.d.ts +4 -0
- package/dist/translations/languages/ko.d.ts.map +1 -0
- package/dist/translations/languages/ko.js +48 -0
- package/dist/translations/languages/ko.js.map +1 -0
- package/dist/translations/languages/lt.d.ts +4 -0
- package/dist/translations/languages/lt.d.ts.map +1 -0
- package/dist/translations/languages/lt.js +48 -0
- package/dist/translations/languages/lt.js.map +1 -0
- package/dist/translations/languages/lv.d.ts +4 -0
- package/dist/translations/languages/lv.d.ts.map +1 -0
- package/dist/translations/languages/lv.js +48 -0
- package/dist/translations/languages/lv.js.map +1 -0
- package/dist/translations/languages/my.d.ts +4 -0
- package/dist/translations/languages/my.d.ts.map +1 -0
- package/dist/translations/languages/my.js +48 -0
- package/dist/translations/languages/my.js.map +1 -0
- package/dist/translations/languages/nb.d.ts +4 -0
- package/dist/translations/languages/nb.d.ts.map +1 -0
- package/dist/translations/languages/nb.js +48 -0
- package/dist/translations/languages/nb.js.map +1 -0
- package/dist/translations/languages/nl.d.ts +4 -0
- package/dist/translations/languages/nl.d.ts.map +1 -0
- package/dist/translations/languages/nl.js +48 -0
- package/dist/translations/languages/nl.js.map +1 -0
- package/dist/translations/languages/pl.d.ts +4 -0
- package/dist/translations/languages/pl.d.ts.map +1 -0
- package/dist/translations/languages/pl.js +48 -0
- package/dist/translations/languages/pl.js.map +1 -0
- package/dist/translations/languages/pt.d.ts +4 -0
- package/dist/translations/languages/pt.d.ts.map +1 -0
- package/dist/translations/languages/pt.js +48 -0
- package/dist/translations/languages/pt.js.map +1 -0
- package/dist/translations/languages/ro.d.ts +4 -0
- package/dist/translations/languages/ro.d.ts.map +1 -0
- package/dist/translations/languages/ro.js +48 -0
- package/dist/translations/languages/ro.js.map +1 -0
- package/dist/translations/languages/rs.d.ts +4 -0
- package/dist/translations/languages/rs.d.ts.map +1 -0
- package/dist/translations/languages/rs.js +48 -0
- package/dist/translations/languages/rs.js.map +1 -0
- package/dist/translations/languages/rsLatin.d.ts +4 -0
- package/dist/translations/languages/rsLatin.d.ts.map +1 -0
- package/dist/translations/languages/rsLatin.js +48 -0
- package/dist/translations/languages/rsLatin.js.map +1 -0
- package/dist/translations/languages/ru.d.ts +4 -0
- package/dist/translations/languages/ru.d.ts.map +1 -0
- package/dist/translations/languages/ru.js +48 -0
- package/dist/translations/languages/ru.js.map +1 -0
- package/dist/translations/languages/sk.d.ts +4 -0
- package/dist/translations/languages/sk.d.ts.map +1 -0
- package/dist/translations/languages/sk.js +48 -0
- package/dist/translations/languages/sk.js.map +1 -0
- package/dist/translations/languages/sl.d.ts +4 -0
- package/dist/translations/languages/sl.d.ts.map +1 -0
- package/dist/translations/languages/sl.js +48 -0
- package/dist/translations/languages/sl.js.map +1 -0
- package/dist/translations/languages/sv.d.ts +4 -0
- package/dist/translations/languages/sv.d.ts.map +1 -0
- package/dist/translations/languages/sv.js +48 -0
- package/dist/translations/languages/sv.js.map +1 -0
- package/dist/translations/languages/ta.d.ts +4 -0
- package/dist/translations/languages/ta.d.ts.map +1 -0
- package/dist/translations/languages/ta.js +48 -0
- package/dist/translations/languages/ta.js.map +1 -0
- package/dist/translations/languages/th.d.ts +4 -0
- package/dist/translations/languages/th.d.ts.map +1 -0
- package/dist/translations/languages/th.js +48 -0
- package/dist/translations/languages/th.js.map +1 -0
- package/dist/translations/languages/tr.d.ts +4 -0
- package/dist/translations/languages/tr.d.ts.map +1 -0
- package/dist/translations/languages/tr.js +48 -0
- package/dist/translations/languages/tr.js.map +1 -0
- package/dist/translations/languages/translation-schema.json +114 -0
- package/dist/translations/languages/uk.d.ts +4 -0
- package/dist/translations/languages/uk.d.ts.map +1 -0
- package/dist/translations/languages/uk.js +48 -0
- package/dist/translations/languages/uk.js.map +1 -0
- package/dist/translations/languages/vi.d.ts +4 -0
- package/dist/translations/languages/vi.d.ts.map +1 -0
- package/dist/translations/languages/vi.js +48 -0
- package/dist/translations/languages/vi.js.map +1 -0
- package/dist/translations/languages/zh.d.ts +4 -0
- package/dist/translations/languages/zh.d.ts.map +1 -0
- package/dist/translations/languages/zh.js +48 -0
- package/dist/translations/languages/zh.js.map +1 -0
- package/dist/translations/languages/zhTw.d.ts +4 -0
- package/dist/translations/languages/zhTw.d.ts.map +1 -0
- package/dist/translations/languages/zhTw.js +48 -0
- package/dist/translations/languages/zhTw.js.map +1 -0
- package/dist/translations/types.d.ts +38 -0
- package/dist/translations/types.d.ts.map +1 -0
- package/dist/translations/types.js +3 -0
- package/dist/translations/types.js.map +1 -0
- package/dist/types.d.ts +221 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utilities/buildDisabledFieldRegex.d.ts +5 -0
- package/dist/utilities/buildDisabledFieldRegex.d.ts.map +1 -0
- package/dist/utilities/buildDisabledFieldRegex.js +12 -0
- package/dist/utilities/buildDisabledFieldRegex.js.map +1 -0
- package/dist/utilities/collectDisabledFieldPaths.d.ts +15 -0
- package/dist/utilities/collectDisabledFieldPaths.d.ts.map +1 -0
- package/dist/utilities/collectDisabledFieldPaths.js +61 -0
- package/dist/utilities/collectDisabledFieldPaths.js.map +1 -0
- package/dist/utilities/flattenObject.d.ts +11 -0
- package/dist/utilities/flattenObject.d.ts.map +1 -0
- package/dist/utilities/flattenObject.js +129 -0
- package/dist/utilities/flattenObject.js.map +1 -0
- package/dist/utilities/getExportFieldFunctions.d.ts +12 -0
- package/dist/utilities/getExportFieldFunctions.d.ts.map +1 -0
- package/dist/utilities/getExportFieldFunctions.js +102 -0
- package/dist/utilities/getExportFieldFunctions.js.map +1 -0
- package/dist/utilities/getFilename.d.ts +6 -0
- package/dist/utilities/getFilename.d.ts.map +1 -0
- package/dist/utilities/getFilename.js +13 -0
- package/dist/utilities/getFilename.js.map +1 -0
- package/dist/utilities/getFlattenedFieldKeys.d.ts +24 -0
- package/dist/utilities/getFlattenedFieldKeys.d.ts.map +1 -0
- package/dist/utilities/getFlattenedFieldKeys.js +95 -0
- package/dist/utilities/getFlattenedFieldKeys.js.map +1 -0
- package/dist/utilities/getImportFieldFunctions.d.ts +12 -0
- package/dist/utilities/getImportFieldFunctions.d.ts.map +1 -0
- package/dist/utilities/getImportFieldFunctions.js +130 -0
- package/dist/utilities/getImportFieldFunctions.js.map +1 -0
- package/dist/utilities/getPluginCollections.d.ts +39 -0
- package/dist/utilities/getPluginCollections.d.ts.map +1 -0
- package/dist/utilities/getPluginCollections.js +102 -0
- package/dist/utilities/getPluginCollections.js.map +1 -0
- package/dist/utilities/getSchemaColumns.d.ts +43 -0
- package/dist/utilities/getSchemaColumns.d.ts.map +1 -0
- package/dist/utilities/getSchemaColumns.js +163 -0
- package/dist/utilities/getSchemaColumns.js.map +1 -0
- package/dist/utilities/getSelect.d.ts +11 -0
- package/dist/utilities/getSelect.d.ts.map +1 -0
- package/dist/utilities/getSelect.js +27 -0
- package/dist/utilities/getSelect.js.map +1 -0
- package/dist/utilities/getvalueAtPath.d.ts +15 -0
- package/dist/utilities/getvalueAtPath.d.ts.map +1 -0
- package/dist/utilities/getvalueAtPath.js +49 -0
- package/dist/utilities/getvalueAtPath.js.map +1 -0
- package/dist/utilities/parseCSV.d.ts +11 -0
- package/dist/utilities/parseCSV.d.ts.map +1 -0
- package/dist/utilities/parseCSV.js +67 -0
- package/dist/utilities/parseCSV.js.map +1 -0
- package/dist/utilities/parseCSV.spec.js +169 -0
- package/dist/utilities/parseCSV.spec.js.map +1 -0
- package/dist/utilities/parseJSON.d.ts +11 -0
- package/dist/utilities/parseJSON.d.ts.map +1 -0
- package/dist/utilities/parseJSON.js +25 -0
- package/dist/utilities/parseJSON.js.map +1 -0
- package/dist/utilities/processRichTextField.d.ts +6 -0
- package/dist/utilities/processRichTextField.d.ts.map +1 -0
- package/dist/utilities/processRichTextField.js +45 -0
- package/dist/utilities/processRichTextField.js.map +1 -0
- package/dist/utilities/removeDisabledFields.d.ts +15 -0
- package/dist/utilities/removeDisabledFields.d.ts.map +1 -0
- package/dist/utilities/removeDisabledFields.js +66 -0
- package/dist/utilities/removeDisabledFields.js.map +1 -0
- package/dist/utilities/setNestedValue.d.ts +19 -0
- package/dist/utilities/setNestedValue.d.ts.map +1 -0
- package/dist/utilities/setNestedValue.js +55 -0
- package/dist/utilities/setNestedValue.js.map +1 -0
- package/dist/utilities/sortHelpers.d.ts +6 -0
- package/dist/utilities/sortHelpers.d.ts.map +1 -0
- package/dist/utilities/sortHelpers.js +14 -0
- package/dist/utilities/sortHelpers.js.map +1 -0
- package/dist/utilities/unflattenObject.d.ts +11 -0
- package/dist/utilities/unflattenObject.d.ts.map +1 -0
- package/dist/utilities/unflattenObject.js +431 -0
- package/dist/utilities/unflattenObject.js.map +1 -0
- package/dist/utilities/unflattenObject.spec.js +680 -0
- package/dist/utilities/unflattenObject.spec.js.map +1 -0
- package/dist/utilities/useBatchProcessor.d.ts +103 -0
- package/dist/utilities/useBatchProcessor.d.ts.map +1 -0
- package/dist/utilities/useBatchProcessor.js +88 -0
- package/dist/utilities/useBatchProcessor.js.map +1 -0
- package/dist/utilities/validateLimitValue.d.ts +3 -0
- package/dist/utilities/validateLimitValue.d.ts.map +1 -0
- package/dist/utilities/validateLimitValue.js +12 -0
- package/dist/utilities/validateLimitValue.js.map +1 -0
- package/license.md +22 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|