@payloadcms/plugin-import-export 3.77.0-internal.0b6b4e4 → 3.77.0-internal.16f474b

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 (73) hide show
  1. package/dist/components/CollectionField/index.d.ts +2 -2
  2. package/dist/components/CollectionField/index.d.ts.map +1 -1
  3. package/dist/components/CollectionField/index.js +5 -28
  4. package/dist/components/CollectionField/index.js.map +1 -1
  5. package/dist/components/CollectionSelectField/index.d.ts +13 -0
  6. package/dist/components/CollectionSelectField/index.d.ts.map +1 -0
  7. package/dist/components/CollectionSelectField/index.js +159 -0
  8. package/dist/components/CollectionSelectField/index.js.map +1 -0
  9. package/dist/components/ExportListMenuItem/index.d.ts.map +1 -1
  10. package/dist/components/ExportListMenuItem/index.js +5 -1
  11. package/dist/components/ExportListMenuItem/index.js.map +1 -1
  12. package/dist/components/ExportPreview/index.d.ts.map +1 -1
  13. package/dist/components/ExportPreview/index.js.map +1 -1
  14. package/dist/components/FieldsToExport/index.js +1 -1
  15. package/dist/components/FieldsToExport/index.js.map +1 -1
  16. package/dist/components/ImportPreview/index.d.ts.map +1 -1
  17. package/dist/components/ImportPreview/index.js +50 -30
  18. package/dist/components/ImportPreview/index.js.map +1 -1
  19. package/dist/export/createExport.d.ts +1 -2
  20. package/dist/export/createExport.d.ts.map +1 -1
  21. package/dist/export/createExport.js +2 -1
  22. package/dist/export/createExport.js.map +1 -1
  23. package/dist/export/getCreateExportCollectionTask.d.ts.map +1 -1
  24. package/dist/export/getCreateExportCollectionTask.js +12 -1
  25. package/dist/export/getCreateExportCollectionTask.js.map +1 -1
  26. package/dist/export/getExportCollection.d.ts +5 -1
  27. package/dist/export/getExportCollection.d.ts.map +1 -1
  28. package/dist/export/getExportCollection.js +20 -5
  29. package/dist/export/getExportCollection.js.map +1 -1
  30. package/dist/export/getFields.d.ts +7 -1
  31. package/dist/export/getFields.d.ts.map +1 -1
  32. package/dist/export/getFields.js +15 -3
  33. package/dist/export/getFields.js.map +1 -1
  34. package/dist/exports/rsc.d.ts +0 -1
  35. package/dist/exports/rsc.d.ts.map +1 -1
  36. package/dist/exports/rsc.js +0 -1
  37. package/dist/exports/rsc.js.map +1 -1
  38. package/dist/import/batchProcessor.d.ts.map +1 -1
  39. package/dist/import/batchProcessor.js +9 -3
  40. package/dist/import/batchProcessor.js.map +1 -1
  41. package/dist/import/getFields.d.ts +7 -3
  42. package/dist/import/getFields.d.ts.map +1 -1
  43. package/dist/import/getFields.js +12 -7
  44. package/dist/import/getFields.js.map +1 -1
  45. package/dist/import/getImportCollection.d.ts +6 -3
  46. package/dist/import/getImportCollection.d.ts.map +1 -1
  47. package/dist/import/getImportCollection.js +7 -4
  48. package/dist/import/getImportCollection.js.map +1 -1
  49. package/dist/index.d.ts +5 -0
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +2 -0
  52. package/dist/index.js.map +1 -1
  53. package/dist/utilities/getFilename.d.ts +1 -1
  54. package/dist/utilities/getFilename.js +3 -3
  55. package/dist/utilities/getFilename.js.map +1 -1
  56. package/dist/utilities/getPluginCollections.d.ts.map +1 -1
  57. package/dist/utilities/getPluginCollections.js +106 -34
  58. package/dist/utilities/getPluginCollections.js.map +1 -1
  59. package/dist/utilities/getSchemaColumns.d.ts.map +1 -1
  60. package/dist/utilities/getSchemaColumns.js +9 -56
  61. package/dist/utilities/getSchemaColumns.js.map +1 -1
  62. package/dist/utilities/getSchemaColumns.spec.js +157 -0
  63. package/dist/utilities/getSchemaColumns.spec.js.map +1 -0
  64. package/dist/utilities/parseCSV.d.ts.map +1 -1
  65. package/dist/utilities/parseCSV.js +1 -0
  66. package/dist/utilities/parseCSV.js.map +1 -1
  67. package/dist/utilities/parseCSV.spec.js +26 -0
  68. package/dist/utilities/parseCSV.spec.js.map +1 -1
  69. package/package.json +8 -8
  70. package/dist/components/ImportCollectionField/index.d.ts +0 -3
  71. package/dist/components/ImportCollectionField/index.d.ts.map +0 -1
  72. package/dist/components/ImportCollectionField/index.js +0 -17
  73. package/dist/components/ImportCollectionField/index.js.map +0 -1
@@ -1,3 +1,3 @@
1
- import type React from 'react';
2
- export declare const CollectionField: React.FC;
1
+ import type { TextFieldClientComponent } from 'payload';
2
+ export declare const CollectionField: TextFieldClientComponent;
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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,EAuBnC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/CollectionField/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AAIvD,eAAO,MAAM,eAAe,EAAE,wBAE7B,CAAA"}
@@ -1,33 +1,10 @@
1
1
  'use client';
2
- import { useDocumentInfo, useField } from '@payloadcms/ui';
3
- import { useEffect } from 'react';
4
- import { useImportExport } from '../ImportExportProvider/index.js';
5
- export const CollectionField = ()=>{
6
- const { id, collectionSlug, docConfig } = useDocumentInfo();
7
- const { setValue } = useField({
8
- path: 'collectionSlug'
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { CollectionSelectField } from '../CollectionSelectField/index.js';
4
+ export const CollectionField = (props)=>{
5
+ return /*#__PURE__*/ _jsx(CollectionSelectField, {
6
+ textFieldProps: props
9
7
  });
10
- const { collection } = useImportExport();
11
- const defaultCollectionSlug = docConfig?.admin?.custom?.defaultCollectionSlug;
12
- useEffect(()=>{
13
- if (id) {
14
- return;
15
- }
16
- if (collection) {
17
- setValue(collection);
18
- } else if (defaultCollectionSlug) {
19
- setValue(defaultCollectionSlug);
20
- } else if (collectionSlug) {
21
- setValue(collectionSlug);
22
- }
23
- }, [
24
- id,
25
- collection,
26
- setValue,
27
- collectionSlug,
28
- defaultCollectionSlug
29
- ]);
30
- return null;
31
8
  };
32
9
 
33
10
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/CollectionField/index.tsx"],"sourcesContent":["'use client'\nimport type React from 'react'\n\nimport { useDocumentInfo, useField } from '@payloadcms/ui'\nimport { useEffect } from 'react'\n\nimport { useImportExport } from '../ImportExportProvider/index.js'\n\nexport const CollectionField: React.FC = () => {\n const { id, collectionSlug, docConfig } = useDocumentInfo()\n const { setValue } = useField({ path: 'collectionSlug' })\n const { collection } = useImportExport()\n\n const defaultCollectionSlug = docConfig?.admin?.custom?.defaultCollectionSlug as\n | string\n | undefined\n\n useEffect(() => {\n if (id) {\n return\n }\n if (collection) {\n setValue(collection)\n } else if (defaultCollectionSlug) {\n setValue(defaultCollectionSlug)\n } else if (collectionSlug) {\n setValue(collectionSlug)\n }\n }, [id, collection, setValue, collectionSlug, defaultCollectionSlug])\n\n return null\n}\n"],"names":["useDocumentInfo","useField","useEffect","useImportExport","CollectionField","id","collectionSlug","docConfig","setValue","path","collection","defaultCollectionSlug","admin","custom"],"mappings":"AAAA;AAGA,SAASA,eAAe,EAAEC,QAAQ,QAAQ,iBAAgB;AAC1D,SAASC,SAAS,QAAQ,QAAO;AAEjC,SAASC,eAAe,QAAQ,mCAAkC;AAElE,OAAO,MAAMC,kBAA4B;IACvC,MAAM,EAAEC,EAAE,EAAEC,cAAc,EAAEC,SAAS,EAAE,GAAGP;IAC1C,MAAM,EAAEQ,QAAQ,EAAE,GAAGP,SAAS;QAAEQ,MAAM;IAAiB;IACvD,MAAM,EAAEC,UAAU,EAAE,GAAGP;IAEvB,MAAMQ,wBAAwBJ,WAAWK,OAAOC,QAAQF;IAIxDT,UAAU;QACR,IAAIG,IAAI;YACN;QACF;QACA,IAAIK,YAAY;YACdF,SAASE;QACX,OAAO,IAAIC,uBAAuB;YAChCH,SAASG;QACX,OAAO,IAAIL,gBAAgB;YACzBE,SAASF;QACX;IACF,GAAG;QAACD;QAAIK;QAAYF;QAAUF;QAAgBK;KAAsB;IAEpE,OAAO;AACT,EAAC"}
1
+ {"version":3,"sources":["../../../src/components/CollectionField/index.tsx"],"sourcesContent":["'use client'\nimport type { TextFieldClientComponent } from 'payload'\n\nimport { CollectionSelectField } from '../CollectionSelectField/index.js'\n\nexport const CollectionField: TextFieldClientComponent = (props) => {\n return <CollectionSelectField textFieldProps={props} />\n}\n"],"names":["CollectionSelectField","CollectionField","props","textFieldProps"],"mappings":"AAAA;;AAGA,SAASA,qBAAqB,QAAQ,oCAAmC;AAEzE,OAAO,MAAMC,kBAA4C,CAACC;IACxD,qBAAO,KAACF;QAAsBG,gBAAgBD;;AAChD,EAAC"}
@@ -0,0 +1,13 @@
1
+ import type { TextFieldClientProps } from 'payload';
2
+ type CollectionSelectFieldProps = {
3
+ textFieldProps: TextFieldClientProps;
4
+ };
5
+ /**
6
+ * Custom component for rendering a collection slug selector.
7
+ * Uses FieldLabel and ReactSelect directly for better control over the field.
8
+ *
9
+ * Used by both export and import collection field components.
10
+ */
11
+ export declare function CollectionSelectField({ textFieldProps }: CollectionSelectFieldProps): import("react").JSX.Element;
12
+ export {};
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/CollectionSelectField/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAiBnD,KAAK,0BAA0B,GAAG;IAChC,cAAc,EAAE,oBAAoB,CAAA;CACrC,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,cAAc,EAAE,EAAE,0BAA0B,+BA0HnF"}
@@ -0,0 +1,159 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { getTranslation } from '@payloadcms/translations';
4
+ import { FieldDescription, FieldError, FieldLabel, ReactSelect, useConfig, useDocumentInfo, useField, useTranslation } from '@payloadcms/ui';
5
+ import { useCallback, useEffect, useMemo } from 'react';
6
+ import { useImportExport } from '../ImportExportProvider/index.js';
7
+ /**
8
+ * Custom component for rendering a collection slug selector.
9
+ * Uses FieldLabel and ReactSelect directly for better control over the field.
10
+ *
11
+ * Used by both export and import collection field components.
12
+ */ export function CollectionSelectField({ textFieldProps }) {
13
+ const { field, path, readOnly: readOnlyFromProps } = textFieldProps;
14
+ const { label, required } = field;
15
+ const { id: docId, docConfig, initialData } = useDocumentInfo();
16
+ const { config } = useConfig();
17
+ const { setValue, showError, value } = useField({
18
+ path
19
+ });
20
+ const { collection: collectionFromContext } = useImportExport();
21
+ const { i18n } = useTranslation();
22
+ const fieldId = path ? `field-${path.replace(/\./g, '__')}` : undefined;
23
+ const options = useMemo(()=>{
24
+ const validSlugs = docConfig?.admin?.custom?.['plugin-import-export']?.collectionSlugs || [];
25
+ const slugsToUse = validSlugs.length > 0 ? validSlugs : config.collections.map((c)=>c.slug);
26
+ return slugsToUse.map((slug)=>{
27
+ const collectionConfig = config.collections.find((c)=>c.slug === slug);
28
+ const labelSource = collectionConfig?.labels?.plural || collectionConfig?.labels?.singular || slug;
29
+ return {
30
+ label: getTranslation(labelSource, i18n),
31
+ value: slug
32
+ };
33
+ });
34
+ }, [
35
+ docConfig?.admin?.custom,
36
+ config.collections,
37
+ i18n
38
+ ]);
39
+ const presetValue = useMemo(()=>{
40
+ if (initialData?.collectionSlug) {
41
+ return initialData.collectionSlug;
42
+ }
43
+ if (collectionFromContext) {
44
+ return collectionFromContext;
45
+ }
46
+ return null;
47
+ }, [
48
+ initialData?.collectionSlug,
49
+ collectionFromContext
50
+ ]);
51
+ // Determine if field should be readonly:
52
+ // - Explicit readOnly from props
53
+ // - Existing document (has ID)
54
+ // - Only one option available
55
+ // - Preset value from drawer/context
56
+ const isReadOnly = useMemo(()=>{
57
+ if (readOnlyFromProps) {
58
+ return true;
59
+ }
60
+ if (docId) {
61
+ return true;
62
+ }
63
+ if (options.length === 1) {
64
+ return true;
65
+ }
66
+ if (presetValue) {
67
+ return true;
68
+ }
69
+ return false;
70
+ }, [
71
+ readOnlyFromProps,
72
+ docId,
73
+ options.length,
74
+ presetValue
75
+ ]);
76
+ useEffect(()=>{
77
+ if (docId) {
78
+ return;
79
+ }
80
+ if (presetValue && value !== presetValue) {
81
+ setValue(presetValue);
82
+ return;
83
+ }
84
+ if (!value && options.length > 0 && options[0]?.value) {
85
+ setValue(options[0].value);
86
+ }
87
+ }, [
88
+ docId,
89
+ presetValue,
90
+ value,
91
+ options,
92
+ setValue
93
+ ]);
94
+ const selectedOption = useMemo(()=>{
95
+ if (!value) {
96
+ return undefined;
97
+ }
98
+ const found = options.find((opt)=>opt.value === value);
99
+ if (found) {
100
+ return found;
101
+ }
102
+ return {
103
+ label: value,
104
+ value
105
+ };
106
+ }, [
107
+ value,
108
+ options
109
+ ]);
110
+ const handleChange = useCallback((selected)=>{
111
+ if (Array.isArray(selected)) {
112
+ setValue(selected[0]?.value ?? '');
113
+ } else {
114
+ setValue(selected?.value ?? '');
115
+ }
116
+ }, [
117
+ setValue
118
+ ]);
119
+ return /*#__PURE__*/ _jsxs("div", {
120
+ className: [
121
+ 'field-type',
122
+ 'select',
123
+ showError && 'error',
124
+ isReadOnly && 'read-only'
125
+ ].filter(Boolean).join(' '),
126
+ id: fieldId,
127
+ children: [
128
+ /*#__PURE__*/ _jsx(FieldLabel, {
129
+ label: label,
130
+ path: path,
131
+ required: required
132
+ }),
133
+ /*#__PURE__*/ _jsxs("div", {
134
+ className: "field-type__wrap",
135
+ children: [
136
+ /*#__PURE__*/ _jsx(FieldError, {
137
+ path: path,
138
+ showError: showError
139
+ }),
140
+ /*#__PURE__*/ _jsx(ReactSelect, {
141
+ disabled: isReadOnly,
142
+ isClearable: false,
143
+ isSearchable: !isReadOnly && options.length > 5,
144
+ onChange: handleChange,
145
+ options: options,
146
+ showError: showError,
147
+ value: selectedOption
148
+ })
149
+ ]
150
+ }),
151
+ /*#__PURE__*/ _jsx(FieldDescription, {
152
+ description: field.admin?.description,
153
+ path: path
154
+ })
155
+ ]
156
+ });
157
+ }
158
+
159
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/CollectionSelectField/index.tsx"],"sourcesContent":["'use client'\nimport type { ReactSelectOption } from '@payloadcms/ui'\nimport type { TextFieldClientProps } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n FieldDescription,\n FieldError,\n FieldLabel,\n ReactSelect,\n useConfig,\n useDocumentInfo,\n useField,\n useTranslation,\n} from '@payloadcms/ui'\nimport { useCallback, useEffect, useMemo } from 'react'\n\nimport { useImportExport } from '../ImportExportProvider/index.js'\n\ntype CollectionSelectFieldProps = {\n textFieldProps: TextFieldClientProps\n}\n\n/**\n * Custom component for rendering a collection slug selector.\n * Uses FieldLabel and ReactSelect directly for better control over the field.\n *\n * Used by both export and import collection field components.\n */\nexport function CollectionSelectField({ textFieldProps }: CollectionSelectFieldProps) {\n const { field, path, readOnly: readOnlyFromProps } = textFieldProps\n const { label, required } = field\n\n const { id: docId, docConfig, initialData } = useDocumentInfo()\n const { config } = useConfig()\n const { setValue, showError, value } = useField<string>({ path })\n const { collection: collectionFromContext } = useImportExport()\n const { i18n } = useTranslation()\n\n const fieldId = path ? `field-${path.replace(/\\./g, '__')}` : undefined\n\n const options = useMemo(() => {\n const validSlugs = (docConfig?.admin?.custom?.['plugin-import-export']?.collectionSlugs ||\n []) as string[]\n\n const slugsToUse = validSlugs.length > 0 ? validSlugs : config.collections.map((c) => c.slug)\n\n return slugsToUse.map((slug) => {\n const collectionConfig = config.collections.find((c) => c.slug === slug)\n const labelSource =\n collectionConfig?.labels?.plural || collectionConfig?.labels?.singular || slug\n return {\n label: getTranslation(labelSource, i18n),\n value: slug,\n }\n })\n }, [docConfig?.admin?.custom, config.collections, i18n])\n\n const presetValue = useMemo(() => {\n if (initialData?.collectionSlug) {\n return initialData.collectionSlug as string\n }\n if (collectionFromContext) {\n return collectionFromContext\n }\n return null\n }, [initialData?.collectionSlug, collectionFromContext])\n\n // Determine if field should be readonly:\n // - Explicit readOnly from props\n // - Existing document (has ID)\n // - Only one option available\n // - Preset value from drawer/context\n const isReadOnly = useMemo(() => {\n if (readOnlyFromProps) {\n return true\n }\n if (docId) {\n return true\n }\n if (options.length === 1) {\n return true\n }\n if (presetValue) {\n return true\n }\n return false\n }, [readOnlyFromProps, docId, options.length, presetValue])\n\n useEffect(() => {\n if (docId) {\n return\n }\n\n if (presetValue && value !== presetValue) {\n setValue(presetValue)\n return\n }\n\n if (!value && options.length > 0 && options[0]?.value) {\n setValue(options[0].value)\n }\n }, [docId, presetValue, value, options, setValue])\n\n const selectedOption = useMemo((): ReactSelectOption | undefined => {\n if (!value) {\n return undefined\n }\n\n const found = options.find((opt) => opt.value === value)\n if (found) {\n return found\n }\n\n return { label: value, value }\n }, [value, options])\n\n const handleChange = useCallback(\n (selected: ReactSelectOption | ReactSelectOption[]) => {\n if (Array.isArray(selected)) {\n setValue(selected[0]?.value ?? '')\n } else {\n setValue(selected?.value ?? '')\n }\n },\n [setValue],\n )\n\n return (\n <div\n className={['field-type', 'select', showError && 'error', isReadOnly && 'read-only']\n .filter(Boolean)\n .join(' ')}\n id={fieldId}\n >\n <FieldLabel label={label} path={path} required={required} />\n <div className=\"field-type__wrap\">\n <FieldError path={path} showError={showError} />\n <ReactSelect\n disabled={isReadOnly}\n isClearable={false}\n isSearchable={!isReadOnly && options.length > 5}\n onChange={handleChange}\n options={options}\n showError={showError}\n value={selectedOption}\n />\n </div>\n <FieldDescription description={field.admin?.description} path={path} />\n </div>\n )\n}\n"],"names":["getTranslation","FieldDescription","FieldError","FieldLabel","ReactSelect","useConfig","useDocumentInfo","useField","useTranslation","useCallback","useEffect","useMemo","useImportExport","CollectionSelectField","textFieldProps","field","path","readOnly","readOnlyFromProps","label","required","id","docId","docConfig","initialData","config","setValue","showError","value","collection","collectionFromContext","i18n","fieldId","replace","undefined","options","validSlugs","admin","custom","collectionSlugs","slugsToUse","length","collections","map","c","slug","collectionConfig","find","labelSource","labels","plural","singular","presetValue","collectionSlug","isReadOnly","selectedOption","found","opt","handleChange","selected","Array","isArray","div","className","filter","Boolean","join","disabled","isClearable","isSearchable","onChange","description"],"mappings":"AAAA;;AAIA,SAASA,cAAc,QAAQ,2BAA0B;AACzD,SACEC,gBAAgB,EAChBC,UAAU,EACVC,UAAU,EACVC,WAAW,EACXC,SAAS,EACTC,eAAe,EACfC,QAAQ,EACRC,cAAc,QACT,iBAAgB;AACvB,SAASC,WAAW,EAAEC,SAAS,EAAEC,OAAO,QAAQ,QAAO;AAEvD,SAASC,eAAe,QAAQ,mCAAkC;AAMlE;;;;;CAKC,GACD,OAAO,SAASC,sBAAsB,EAAEC,cAAc,EAA8B;IAClF,MAAM,EAAEC,KAAK,EAAEC,IAAI,EAAEC,UAAUC,iBAAiB,EAAE,GAAGJ;IACrD,MAAM,EAAEK,KAAK,EAAEC,QAAQ,EAAE,GAAGL;IAE5B,MAAM,EAAEM,IAAIC,KAAK,EAAEC,SAAS,EAAEC,WAAW,EAAE,GAAGlB;IAC9C,MAAM,EAAEmB,MAAM,EAAE,GAAGpB;IACnB,MAAM,EAAEqB,QAAQ,EAAEC,SAAS,EAAEC,KAAK,EAAE,GAAGrB,SAAiB;QAAES;IAAK;IAC/D,MAAM,EAAEa,YAAYC,qBAAqB,EAAE,GAAGlB;IAC9C,MAAM,EAAEmB,IAAI,EAAE,GAAGvB;IAEjB,MAAMwB,UAAUhB,OAAO,CAAC,MAAM,EAAEA,KAAKiB,OAAO,CAAC,OAAO,OAAO,GAAGC;IAE9D,MAAMC,UAAUxB,QAAQ;QACtB,MAAMyB,aAAcb,WAAWc,OAAOC,QAAQ,CAAC,uBAAuB,EAAEC,mBACtE,EAAE;QAEJ,MAAMC,aAAaJ,WAAWK,MAAM,GAAG,IAAIL,aAAaX,OAAOiB,WAAW,CAACC,GAAG,CAAC,CAACC,IAAMA,EAAEC,IAAI;QAE5F,OAAOL,WAAWG,GAAG,CAAC,CAACE;YACrB,MAAMC,mBAAmBrB,OAAOiB,WAAW,CAACK,IAAI,CAAC,CAACH,IAAMA,EAAEC,IAAI,KAAKA;YACnE,MAAMG,cACJF,kBAAkBG,QAAQC,UAAUJ,kBAAkBG,QAAQE,YAAYN;YAC5E,OAAO;gBACL1B,OAAOnB,eAAegD,aAAajB;gBACnCH,OAAOiB;YACT;QACF;IACF,GAAG;QAACtB,WAAWc,OAAOC;QAAQb,OAAOiB,WAAW;QAAEX;KAAK;IAEvD,MAAMqB,cAAczC,QAAQ;QAC1B,IAAIa,aAAa6B,gBAAgB;YAC/B,OAAO7B,YAAY6B,cAAc;QACnC;QACA,IAAIvB,uBAAuB;YACzB,OAAOA;QACT;QACA,OAAO;IACT,GAAG;QAACN,aAAa6B;QAAgBvB;KAAsB;IAEvD,yCAAyC;IACzC,iCAAiC;IACjC,+BAA+B;IAC/B,8BAA8B;IAC9B,qCAAqC;IACrC,MAAMwB,aAAa3C,QAAQ;QACzB,IAAIO,mBAAmB;YACrB,OAAO;QACT;QACA,IAAII,OAAO;YACT,OAAO;QACT;QACA,IAAIa,QAAQM,MAAM,KAAK,GAAG;YACxB,OAAO;QACT;QACA,IAAIW,aAAa;YACf,OAAO;QACT;QACA,OAAO;IACT,GAAG;QAAClC;QAAmBI;QAAOa,QAAQM,MAAM;QAAEW;KAAY;IAE1D1C,UAAU;QACR,IAAIY,OAAO;YACT;QACF;QAEA,IAAI8B,eAAexB,UAAUwB,aAAa;YACxC1B,SAAS0B;YACT;QACF;QAEA,IAAI,CAACxB,SAASO,QAAQM,MAAM,GAAG,KAAKN,OAAO,CAAC,EAAE,EAAEP,OAAO;YACrDF,SAASS,OAAO,CAAC,EAAE,CAACP,KAAK;QAC3B;IACF,GAAG;QAACN;QAAO8B;QAAaxB;QAAOO;QAAST;KAAS;IAEjD,MAAM6B,iBAAiB5C,QAAQ;QAC7B,IAAI,CAACiB,OAAO;YACV,OAAOM;QACT;QAEA,MAAMsB,QAAQrB,QAAQY,IAAI,CAAC,CAACU,MAAQA,IAAI7B,KAAK,KAAKA;QAClD,IAAI4B,OAAO;YACT,OAAOA;QACT;QAEA,OAAO;YAAErC,OAAOS;YAAOA;QAAM;IAC/B,GAAG;QAACA;QAAOO;KAAQ;IAEnB,MAAMuB,eAAejD,YACnB,CAACkD;QACC,IAAIC,MAAMC,OAAO,CAACF,WAAW;YAC3BjC,SAASiC,QAAQ,CAAC,EAAE,EAAE/B,SAAS;QACjC,OAAO;YACLF,SAASiC,UAAU/B,SAAS;QAC9B;IACF,GACA;QAACF;KAAS;IAGZ,qBACE,MAACoC;QACCC,WAAW;YAAC;YAAc;YAAUpC,aAAa;YAAS2B,cAAc;SAAY,CACjFU,MAAM,CAACC,SACPC,IAAI,CAAC;QACR7C,IAAIW;;0BAEJ,KAAC7B;gBAAWgB,OAAOA;gBAAOH,MAAMA;gBAAMI,UAAUA;;0BAChD,MAAC0C;gBAAIC,WAAU;;kCACb,KAAC7D;wBAAWc,MAAMA;wBAAMW,WAAWA;;kCACnC,KAACvB;wBACC+D,UAAUb;wBACVc,aAAa;wBACbC,cAAc,CAACf,cAAcnB,QAAQM,MAAM,GAAG;wBAC9C6B,UAAUZ;wBACVvB,SAASA;wBACTR,WAAWA;wBACXC,OAAO2B;;;;0BAGX,KAACtD;gBAAiBsE,aAAaxD,MAAMsB,KAAK,EAAEkC;gBAAavD,MAAMA;;;;AAGrE"}
@@ -1 +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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ExportListMenuItem/index.tsx"],"names":[],"mappings":"AAUA,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"}
@@ -36,7 +36,11 @@ export const ExportListMenuItem = ({ collectionSlug, exportCollectionSlug })=>{
36
36
  }
37
37
  })
38
38
  }),
39
- /*#__PURE__*/ _jsx(DocumentDrawer, {})
39
+ /*#__PURE__*/ _jsx(DocumentDrawer, {
40
+ initialData: {
41
+ collectionSlug
42
+ }
43
+ })
40
44
  ]
41
45
  });
42
46
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/ExportListMenuItem/index.tsx"],"sourcesContent":["'use client'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n PopupList,\n Translation,\n useConfig,\n useDocumentDrawer,\n useDocumentInfo,\n useTranslation,\n} from '@payloadcms/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,2BAA0B;AACzD,SACEC,SAAS,EACTC,WAAW,EACXC,SAAS,EACTC,iBAAiB,EAEjBC,cAAc,QACT,iBAAgB;AACvB,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"}
1
+ {"version":3,"sources":["../../../src/components/ExportListMenuItem/index.tsx"],"sourcesContent":["'use client'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n PopupList,\n Translation,\n useConfig,\n useDocumentDrawer,\n useTranslation,\n} from '@payloadcms/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 initialData={{ collectionSlug }} />\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","initialData"],"mappings":"AAAA;;AAEA,SAASA,cAAc,QAAQ,2BAA0B;AACzD,SACEC,SAAS,EACTC,WAAW,EACXC,SAAS,EACTC,iBAAiB,EACjBC,cAAc,QACT,iBAAgB;AACvB,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;gBAAeW,aAAa;oBAAEjB;gBAAe;;;;AAGpD,EAAC"}
@@ -1 +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,EAkRjC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ExportPreview/index.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAqD,MAAM,OAAO,CAAA;AASzE,OAAO,cAAc,CAAA;AAKrB,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAkRjC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/ExportPreview/index.tsx"],"sourcesContent":["'use client'\nimport type { Column } from '@payloadcms/ui'\nimport type { ClientField, PaginatedDocs, Where } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n CodeEditorLazy,\n Pagination,\n PerPage,\n Table,\n Translation,\n useConfig,\n useDebouncedEffect,\n useDocumentInfo,\n useFormFields,\n useTranslation,\n} from '@payloadcms/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 [maxLimit, setMaxLimit] = useState<number | undefined>(undefined)\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 maxLimit: serverMaxLimit,\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 setMaxLimit(serverMaxLimit)\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 <div className={`${baseClass}__export-info`}>\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 {typeof maxLimit === 'number' &&\n maxLimit > 0 &&\n typeof limit === 'number' &&\n limit > maxLimit && (\n <span className={`${baseClass}__limit-capped`}>\n <Translation\n // @ts-expect-error - plugin translations not typed\n i18nKey=\"plugin-import-export:limitCapped\"\n t={t}\n variables={{\n limit: maxLimit,\n }}\n />\n </span>\n )}\n </div>\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","maxLimit","setMaxLimit","undefined","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","serverMaxLimit","page","responsePage","totalPages","json","allKeys","Array","from","Set","flatMap","doc","Object","keys","fieldKeys","length","newColumns","map","key","accessor","active","field","name","Heading","renderedCells","val","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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"}
1
+ {"version":3,"sources":["../../../src/components/ExportPreview/index.tsx"],"sourcesContent":["'use client'\nimport type { ClientField, Column, PaginatedDocs, Where } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n CodeEditorLazy,\n Pagination,\n PerPage,\n Table,\n Translation,\n useConfig,\n useDebouncedEffect,\n useDocumentInfo,\n useFormFields,\n useTranslation,\n} from '@payloadcms/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 [maxLimit, setMaxLimit] = useState<number | undefined>(undefined)\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 maxLimit: serverMaxLimit,\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 setMaxLimit(serverMaxLimit)\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 <div className={`${baseClass}__export-info`}>\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 {typeof maxLimit === 'number' &&\n maxLimit > 0 &&\n typeof limit === 'number' &&\n limit > maxLimit && (\n <span className={`${baseClass}__limit-capped`}>\n <Translation\n // @ts-expect-error - plugin translations not typed\n i18nKey=\"plugin-import-export:limitCapped\"\n t={t}\n variables={{\n limit: maxLimit,\n }}\n />\n </span>\n )}\n </div>\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","maxLimit","setMaxLimit","undefined","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","serverMaxLimit","page","responsePage","totalPages","json","allKeys","Array","from","Set","flatMap","doc","Object","keys","fieldKeys","length","newColumns","map","key","accessor","active","field","name","Heading","renderedCells","val","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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"}
@@ -4,7 +4,7 @@ import { FieldLabel, ReactSelect, useConfig, useDocumentInfo, useField, useListQ
4
4
  import React, { useEffect } from 'react';
5
5
  import { useImportExport } from '../ImportExportProvider/index.js';
6
6
  import { reduceFields } from './reduceFields.js';
7
- const baseClass = 'fields-to-export';
7
+ const baseClass = 'field-type fields-to-export';
8
8
  export const FieldsToExport = (props)=>{
9
9
  const { id } = useDocumentInfo();
10
10
  const { setValue, value } = useField();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/FieldsToExport/index.tsx"],"sourcesContent":["'use client'\n\nimport type { SelectFieldClientComponent } from 'payload'\nimport type { ReactNode } from 'react'\n\nimport {\n FieldLabel,\n ReactSelect,\n useConfig,\n useDocumentInfo,\n useField,\n useListQuery,\n} from '@payloadcms/ui'\nimport React, { useEffect } from 'react'\n\nimport { useImportExport } from '../ImportExportProvider/index.js'\nimport { reduceFields } from './reduceFields.js'\n\nconst baseClass = 'fields-to-export'\n\nexport const FieldsToExport: SelectFieldClientComponent = (props) => {\n const { id } = useDocumentInfo()\n const { setValue, value } = useField<string[]>()\n const { value: collectionSlug } = useField<string>({ path: 'collectionSlug' })\n const { getEntityConfig } = useConfig()\n const { collection } = useImportExport()\n const { query } = useListQuery()\n\n const collectionConfig = getEntityConfig({ collectionSlug: collectionSlug ?? collection })\n\n const disabledFields =\n collectionConfig?.admin?.custom?.['plugin-import-export']?.disabledFields ?? []\n\n const fieldOptions = reduceFields({\n disabledFields,\n fields: collectionConfig?.fields,\n })\n\n useEffect(() => {\n if (id || !collectionSlug) {\n return\n }\n\n const queryColumns = query?.columns\n\n if (Array.isArray(queryColumns)) {\n const cleanColumns = queryColumns.filter(\n (col): col is string => typeof col === 'string' && !col.startsWith('-'),\n )\n // If columns are specified in the query, use them\n setValue(cleanColumns)\n } else {\n // Fallback if no columns in query\n setValue(collectionConfig?.admin?.defaultColumns ?? [])\n }\n }, [id, collectionSlug, query?.columns, collectionConfig?.admin?.defaultColumns, setValue])\n\n const onChange = (options: { id: string; label: ReactNode; value: string }[]) => {\n if (!options) {\n setValue([])\n return\n }\n\n const updatedValue = options.map((option) =>\n typeof option === 'object' ? option.value : option,\n )\n\n setValue(updatedValue)\n }\n\n return (\n <div className={baseClass}>\n <FieldLabel label={props.field.label} path={props.path} />\n <ReactSelect\n className={baseClass}\n disabled={props.readOnly}\n getOptionValue={(option) => String(option.value)}\n inputId={`field-${props.path.replace(/\\./g, '__')}`}\n isClearable={true}\n isMulti={true}\n isSortable={true}\n // @ts-expect-error react select option\n onChange={onChange}\n options={fieldOptions}\n value={\n Array.isArray(value)\n ? value.map((val) => {\n const match = fieldOptions.find((opt) => opt.value === val)\n return match ? { ...match, id: val } : { id: val, label: val, value: val }\n })\n : []\n }\n />\n </div>\n )\n}\n"],"names":["FieldLabel","ReactSelect","useConfig","useDocumentInfo","useField","useListQuery","React","useEffect","useImportExport","reduceFields","baseClass","FieldsToExport","props","id","setValue","value","collectionSlug","path","getEntityConfig","collection","query","collectionConfig","disabledFields","admin","custom","fieldOptions","fields","queryColumns","columns","Array","isArray","cleanColumns","filter","col","startsWith","defaultColumns","onChange","options","updatedValue","map","option","div","className","label","field","disabled","readOnly","getOptionValue","String","inputId","replace","isClearable","isMulti","isSortable","val","match","find","opt"],"mappings":"AAAA;;AAKA,SACEA,UAAU,EACVC,WAAW,EACXC,SAAS,EACTC,eAAe,EACfC,QAAQ,EACRC,YAAY,QACP,iBAAgB;AACvB,OAAOC,SAASC,SAAS,QAAQ,QAAO;AAExC,SAASC,eAAe,QAAQ,mCAAkC;AAClE,SAASC,YAAY,QAAQ,oBAAmB;AAEhD,MAAMC,YAAY;AAElB,OAAO,MAAMC,iBAA6C,CAACC;IACzD,MAAM,EAAEC,EAAE,EAAE,GAAGV;IACf,MAAM,EAAEW,QAAQ,EAAEC,KAAK,EAAE,GAAGX;IAC5B,MAAM,EAAEW,OAAOC,cAAc,EAAE,GAAGZ,SAAiB;QAAEa,MAAM;IAAiB;IAC5E,MAAM,EAAEC,eAAe,EAAE,GAAGhB;IAC5B,MAAM,EAAEiB,UAAU,EAAE,GAAGX;IACvB,MAAM,EAAEY,KAAK,EAAE,GAAGf;IAElB,MAAMgB,mBAAmBH,gBAAgB;QAAEF,gBAAgBA,kBAAkBG;IAAW;IAExF,MAAMG,iBACJD,kBAAkBE,OAAOC,QAAQ,CAAC,uBAAuB,EAAEF,kBAAkB,EAAE;IAEjF,MAAMG,eAAehB,aAAa;QAChCa;QACAI,QAAQL,kBAAkBK;IAC5B;IAEAnB,UAAU;QACR,IAAIM,MAAM,CAACG,gBAAgB;YACzB;QACF;QAEA,MAAMW,eAAeP,OAAOQ;QAE5B,IAAIC,MAAMC,OAAO,CAACH,eAAe;YAC/B,MAAMI,eAAeJ,aAAaK,MAAM,CACtC,CAACC,MAAuB,OAAOA,QAAQ,YAAY,CAACA,IAAIC,UAAU,CAAC;YAErE,kDAAkD;YAClDpB,SAASiB;QACX,OAAO;YACL,kCAAkC;YAClCjB,SAASO,kBAAkBE,OAAOY,kBAAkB,EAAE;QACxD;IACF,GAAG;QAACtB;QAAIG;QAAgBI,OAAOQ;QAASP,kBAAkBE,OAAOY;QAAgBrB;KAAS;IAE1F,MAAMsB,WAAW,CAACC;QAChB,IAAI,CAACA,SAAS;YACZvB,SAAS,EAAE;YACX;QACF;QAEA,MAAMwB,eAAeD,QAAQE,GAAG,CAAC,CAACC,SAChC,OAAOA,WAAW,WAAWA,OAAOzB,KAAK,GAAGyB;QAG9C1B,SAASwB;IACX;IAEA,qBACE,MAACG;QAAIC,WAAWhC;;0BACd,KAACV;gBAAW2C,OAAO/B,MAAMgC,KAAK,CAACD,KAAK;gBAAE1B,MAAML,MAAMK,IAAI;;0BACtD,KAAChB;gBACCyC,WAAWhC;gBACXmC,UAAUjC,MAAMkC,QAAQ;gBACxBC,gBAAgB,CAACP,SAAWQ,OAAOR,OAAOzB,KAAK;gBAC/CkC,SAAS,CAAC,MAAM,EAAErC,MAAMK,IAAI,CAACiC,OAAO,CAAC,OAAO,OAAO;gBACnDC,aAAa;gBACbC,SAAS;gBACTC,YAAY;gBACZ,uCAAuC;gBACvCjB,UAAUA;gBACVC,SAASZ;gBACTV,OACEc,MAAMC,OAAO,CAACf,SACVA,MAAMwB,GAAG,CAAC,CAACe;oBACT,MAAMC,QAAQ9B,aAAa+B,IAAI,CAAC,CAACC,MAAQA,IAAI1C,KAAK,KAAKuC;oBACvD,OAAOC,QAAQ;wBAAE,GAAGA,KAAK;wBAAE1C,IAAIyC;oBAAI,IAAI;wBAAEzC,IAAIyC;wBAAKX,OAAOW;wBAAKvC,OAAOuC;oBAAI;gBAC3E,KACA,EAAE;;;;AAKhB,EAAC"}
1
+ {"version":3,"sources":["../../../src/components/FieldsToExport/index.tsx"],"sourcesContent":["'use client'\n\nimport type { SelectFieldClientComponent } from 'payload'\nimport type { ReactNode } from 'react'\n\nimport {\n FieldLabel,\n ReactSelect,\n useConfig,\n useDocumentInfo,\n useField,\n useListQuery,\n} from '@payloadcms/ui'\nimport React, { useEffect } from 'react'\n\nimport { useImportExport } from '../ImportExportProvider/index.js'\nimport { reduceFields } from './reduceFields.js'\n\nconst baseClass = 'field-type fields-to-export'\n\nexport const FieldsToExport: SelectFieldClientComponent = (props) => {\n const { id } = useDocumentInfo()\n const { setValue, value } = useField<string[]>()\n const { value: collectionSlug } = useField<string>({ path: 'collectionSlug' })\n const { getEntityConfig } = useConfig()\n const { collection } = useImportExport()\n const { query } = useListQuery()\n\n const collectionConfig = getEntityConfig({ collectionSlug: collectionSlug ?? collection })\n\n const disabledFields =\n collectionConfig?.admin?.custom?.['plugin-import-export']?.disabledFields ?? []\n\n const fieldOptions = reduceFields({\n disabledFields,\n fields: collectionConfig?.fields,\n })\n\n useEffect(() => {\n if (id || !collectionSlug) {\n return\n }\n\n const queryColumns = query?.columns\n\n if (Array.isArray(queryColumns)) {\n const cleanColumns = queryColumns.filter(\n (col): col is string => typeof col === 'string' && !col.startsWith('-'),\n )\n // If columns are specified in the query, use them\n setValue(cleanColumns)\n } else {\n // Fallback if no columns in query\n setValue(collectionConfig?.admin?.defaultColumns ?? [])\n }\n }, [id, collectionSlug, query?.columns, collectionConfig?.admin?.defaultColumns, setValue])\n\n const onChange = (options: { id: string; label: ReactNode; value: string }[]) => {\n if (!options) {\n setValue([])\n return\n }\n\n const updatedValue = options.map((option) =>\n typeof option === 'object' ? option.value : option,\n )\n\n setValue(updatedValue)\n }\n\n return (\n <div className={baseClass}>\n <FieldLabel label={props.field.label} path={props.path} />\n <ReactSelect\n className={baseClass}\n disabled={props.readOnly}\n getOptionValue={(option) => String(option.value)}\n inputId={`field-${props.path.replace(/\\./g, '__')}`}\n isClearable={true}\n isMulti={true}\n isSortable={true}\n // @ts-expect-error react select option\n onChange={onChange}\n options={fieldOptions}\n value={\n Array.isArray(value)\n ? value.map((val) => {\n const match = fieldOptions.find((opt) => opt.value === val)\n return match ? { ...match, id: val } : { id: val, label: val, value: val }\n })\n : []\n }\n />\n </div>\n )\n}\n"],"names":["FieldLabel","ReactSelect","useConfig","useDocumentInfo","useField","useListQuery","React","useEffect","useImportExport","reduceFields","baseClass","FieldsToExport","props","id","setValue","value","collectionSlug","path","getEntityConfig","collection","query","collectionConfig","disabledFields","admin","custom","fieldOptions","fields","queryColumns","columns","Array","isArray","cleanColumns","filter","col","startsWith","defaultColumns","onChange","options","updatedValue","map","option","div","className","label","field","disabled","readOnly","getOptionValue","String","inputId","replace","isClearable","isMulti","isSortable","val","match","find","opt"],"mappings":"AAAA;;AAKA,SACEA,UAAU,EACVC,WAAW,EACXC,SAAS,EACTC,eAAe,EACfC,QAAQ,EACRC,YAAY,QACP,iBAAgB;AACvB,OAAOC,SAASC,SAAS,QAAQ,QAAO;AAExC,SAASC,eAAe,QAAQ,mCAAkC;AAClE,SAASC,YAAY,QAAQ,oBAAmB;AAEhD,MAAMC,YAAY;AAElB,OAAO,MAAMC,iBAA6C,CAACC;IACzD,MAAM,EAAEC,EAAE,EAAE,GAAGV;IACf,MAAM,EAAEW,QAAQ,EAAEC,KAAK,EAAE,GAAGX;IAC5B,MAAM,EAAEW,OAAOC,cAAc,EAAE,GAAGZ,SAAiB;QAAEa,MAAM;IAAiB;IAC5E,MAAM,EAAEC,eAAe,EAAE,GAAGhB;IAC5B,MAAM,EAAEiB,UAAU,EAAE,GAAGX;IACvB,MAAM,EAAEY,KAAK,EAAE,GAAGf;IAElB,MAAMgB,mBAAmBH,gBAAgB;QAAEF,gBAAgBA,kBAAkBG;IAAW;IAExF,MAAMG,iBACJD,kBAAkBE,OAAOC,QAAQ,CAAC,uBAAuB,EAAEF,kBAAkB,EAAE;IAEjF,MAAMG,eAAehB,aAAa;QAChCa;QACAI,QAAQL,kBAAkBK;IAC5B;IAEAnB,UAAU;QACR,IAAIM,MAAM,CAACG,gBAAgB;YACzB;QACF;QAEA,MAAMW,eAAeP,OAAOQ;QAE5B,IAAIC,MAAMC,OAAO,CAACH,eAAe;YAC/B,MAAMI,eAAeJ,aAAaK,MAAM,CACtC,CAACC,MAAuB,OAAOA,QAAQ,YAAY,CAACA,IAAIC,UAAU,CAAC;YAErE,kDAAkD;YAClDpB,SAASiB;QACX,OAAO;YACL,kCAAkC;YAClCjB,SAASO,kBAAkBE,OAAOY,kBAAkB,EAAE;QACxD;IACF,GAAG;QAACtB;QAAIG;QAAgBI,OAAOQ;QAASP,kBAAkBE,OAAOY;QAAgBrB;KAAS;IAE1F,MAAMsB,WAAW,CAACC;QAChB,IAAI,CAACA,SAAS;YACZvB,SAAS,EAAE;YACX;QACF;QAEA,MAAMwB,eAAeD,QAAQE,GAAG,CAAC,CAACC,SAChC,OAAOA,WAAW,WAAWA,OAAOzB,KAAK,GAAGyB;QAG9C1B,SAASwB;IACX;IAEA,qBACE,MAACG;QAAIC,WAAWhC;;0BACd,KAACV;gBAAW2C,OAAO/B,MAAMgC,KAAK,CAACD,KAAK;gBAAE1B,MAAML,MAAMK,IAAI;;0BACtD,KAAChB;gBACCyC,WAAWhC;gBACXmC,UAAUjC,MAAMkC,QAAQ;gBACxBC,gBAAgB,CAACP,SAAWQ,OAAOR,OAAOzB,KAAK;gBAC/CkC,SAAS,CAAC,MAAM,EAAErC,MAAMK,IAAI,CAACiC,OAAO,CAAC,OAAO,OAAO;gBACnDC,aAAa;gBACbC,SAAS;gBACTC,YAAY;gBACZ,uCAAuC;gBACvCjB,UAAUA;gBACVC,SAASZ;gBACTV,OACEc,MAAMC,OAAO,CAACf,SACVA,MAAMwB,GAAG,CAAC,CAACe;oBACT,MAAMC,QAAQ9B,aAAa+B,IAAI,CAAC,CAACC,MAAQA,IAAI1C,KAAK,KAAKuC;oBACvD,OAAOC,QAAQ;wBAAE,GAAGA,KAAK;wBAAE1C,IAAIyC;oBAAI,IAAI;wBAAEzC,IAAIyC;wBAAKX,OAAOW;wBAAKvC,OAAOuC;oBAAI;gBAC3E,KACA,EAAE;;;;AAKhB,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ImportPreview/index.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAkC,MAAM,OAAO,CAAA;AAStD,OAAO,cAAc,CAAA;AAIrB,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAmlBjC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ImportPreview/index.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAkC,MAAM,OAAO,CAAA;AAStD,OAAO,cAAc,CAAA;AAIrB,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EA2mBjC,CAAA"}
@@ -224,12 +224,8 @@ export const ImportPreview = ()=>{
224
224
  // Just an ID
225
225
  return String(value);
226
226
  } else if (field.type === 'date') {
227
- // Format dates
228
- const dateFormat = field.admin && 'date' in field.admin && field.admin.date?.displayFormat || config.admin.dateFormat;
229
- return new Date(value).toLocaleString(i18n.language, {
230
- dateStyle: 'medium',
231
- timeStyle: 'short'
232
- });
227
+ // Display date as string to avoid wrong locale/timezone conversion
228
+ return String(value);
233
229
  } else if (field.type === 'checkbox') {
234
230
  return value ? '✓' : '✗';
235
231
  } else if (field.type === 'select' || field.type === 'radio') {
@@ -288,42 +284,66 @@ export const ImportPreview = ()=>{
288
284
  });
289
285
  return cols;
290
286
  };
291
- // Add default meta fields at the end
292
287
  const fieldColumns = buildColumnsFromFields(collectionConfig.fields);
293
- const metaFields = [
294
- 'id',
295
- 'createdAt',
296
- 'updatedAt',
297
- '_status'
298
- ];
299
- metaFields.forEach((metaField)=>{
300
- const hasData = docs.some((doc)=>doc[metaField] !== undefined);
301
- if (!hasData) {
302
- return;
303
- }
304
- fieldColumns.push({
305
- accessor: metaField,
288
+ const existingAccessors = new Set(fieldColumns.map((column)=>column.accessor));
289
+ // Discover all fields from document data to determine column order
290
+ // Respect the order fields appear in the data (e.g., CSV column order)
291
+ const dataFieldOrder = [];
292
+ const dataFieldsSet = new Set();
293
+ // Collect all fields from all docs to get comprehensive field list
294
+ docs.forEach((doc)=>{
295
+ Object.keys(doc).forEach((key)=>{
296
+ if (!dataFieldsSet.has(key) && doc[key] !== undefined && doc[key] !== null) {
297
+ dataFieldsSet.add(key);
298
+ dataFieldOrder.push(key);
299
+ }
300
+ });
301
+ });
302
+ // Helper to create a column for a field
303
+ const createColumnForField = (fieldName)=>({
304
+ accessor: fieldName,
306
305
  active: true,
307
306
  field: {
308
- name: metaField
307
+ name: fieldName
309
308
  },
310
- Heading: getTranslation(metaField, i18n),
309
+ Heading: getTranslation(fieldName, i18n),
311
310
  renderedCells: docs.map((doc)=>{
312
- const value = doc[metaField];
311
+ const value = doc[fieldName];
313
312
  if (value === undefined || value === null) {
314
313
  return null;
315
314
  }
316
- if (metaField === 'createdAt' || metaField === 'updatedAt') {
317
- return new Date(value).toLocaleString(i18n.language, {
318
- dateStyle: 'medium',
319
- timeStyle: 'short'
320
- });
321
- }
322
315
  return String(value);
323
316
  })
324
317
  });
318
+ // Build columns respecting data order for fields not in config
319
+ // For fields in config, use their natural order from fieldColumns
320
+ const finalColumns = [];
321
+ const addedAccessors = new Set();
322
+ // Process fields in the order they appear in the data
323
+ dataFieldOrder.forEach((fieldName)=>{
324
+ if (existingAccessors.has(fieldName)) {
325
+ // This field is from the collection config
326
+ const configColumn = fieldColumns.find((col)=>col.accessor === fieldName);
327
+ if (configColumn && !addedAccessors.has(fieldName)) {
328
+ finalColumns.push(configColumn);
329
+ addedAccessors.add(fieldName);
330
+ }
331
+ } else {
332
+ // This is an additional field (system field or extra data field)
333
+ if (!addedAccessors.has(fieldName)) {
334
+ finalColumns.push(createColumnForField(fieldName));
335
+ addedAccessors.add(fieldName);
336
+ }
337
+ }
338
+ });
339
+ // Add any remaining config fields that weren't in the data
340
+ fieldColumns.forEach((col)=>{
341
+ if (!addedAccessors.has(col.accessor)) {
342
+ finalColumns.push(col);
343
+ addedAccessors.add(col.accessor);
344
+ }
325
345
  });
326
- setColumns(fieldColumns);
346
+ setColumns(finalColumns);
327
347
  setDataToRender(docs);
328
348
  } catch (err) {
329
349
  console.error('Error processing file data:', err);