@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.
- package/dist/components/CollectionField/index.d.ts +2 -2
- package/dist/components/CollectionField/index.d.ts.map +1 -1
- package/dist/components/CollectionField/index.js +5 -28
- package/dist/components/CollectionField/index.js.map +1 -1
- package/dist/components/CollectionSelectField/index.d.ts +13 -0
- package/dist/components/CollectionSelectField/index.d.ts.map +1 -0
- package/dist/components/CollectionSelectField/index.js +159 -0
- package/dist/components/CollectionSelectField/index.js.map +1 -0
- package/dist/components/ExportListMenuItem/index.d.ts.map +1 -1
- package/dist/components/ExportListMenuItem/index.js +5 -1
- package/dist/components/ExportListMenuItem/index.js.map +1 -1
- package/dist/components/ExportPreview/index.d.ts.map +1 -1
- package/dist/components/ExportPreview/index.js.map +1 -1
- package/dist/components/FieldsToExport/index.js +1 -1
- package/dist/components/FieldsToExport/index.js.map +1 -1
- package/dist/components/ImportPreview/index.d.ts.map +1 -1
- package/dist/components/ImportPreview/index.js +50 -30
- package/dist/components/ImportPreview/index.js.map +1 -1
- package/dist/export/createExport.d.ts +1 -2
- package/dist/export/createExport.d.ts.map +1 -1
- package/dist/export/createExport.js +2 -1
- package/dist/export/createExport.js.map +1 -1
- package/dist/export/getCreateExportCollectionTask.d.ts.map +1 -1
- package/dist/export/getCreateExportCollectionTask.js +12 -1
- package/dist/export/getCreateExportCollectionTask.js.map +1 -1
- package/dist/export/getExportCollection.d.ts +5 -1
- package/dist/export/getExportCollection.d.ts.map +1 -1
- package/dist/export/getExportCollection.js +20 -5
- package/dist/export/getExportCollection.js.map +1 -1
- package/dist/export/getFields.d.ts +7 -1
- package/dist/export/getFields.d.ts.map +1 -1
- package/dist/export/getFields.js +15 -3
- package/dist/export/getFields.js.map +1 -1
- package/dist/exports/rsc.d.ts +0 -1
- package/dist/exports/rsc.d.ts.map +1 -1
- package/dist/exports/rsc.js +0 -1
- package/dist/exports/rsc.js.map +1 -1
- package/dist/import/batchProcessor.d.ts.map +1 -1
- package/dist/import/batchProcessor.js +9 -3
- package/dist/import/batchProcessor.js.map +1 -1
- package/dist/import/getFields.d.ts +7 -3
- package/dist/import/getFields.d.ts.map +1 -1
- package/dist/import/getFields.js +12 -7
- package/dist/import/getFields.js.map +1 -1
- package/dist/import/getImportCollection.d.ts +6 -3
- package/dist/import/getImportCollection.d.ts.map +1 -1
- package/dist/import/getImportCollection.js +7 -4
- package/dist/import/getImportCollection.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/utilities/getFilename.d.ts +1 -1
- package/dist/utilities/getFilename.js +3 -3
- package/dist/utilities/getFilename.js.map +1 -1
- package/dist/utilities/getPluginCollections.d.ts.map +1 -1
- package/dist/utilities/getPluginCollections.js +106 -34
- package/dist/utilities/getPluginCollections.js.map +1 -1
- package/dist/utilities/getSchemaColumns.d.ts.map +1 -1
- package/dist/utilities/getSchemaColumns.js +9 -56
- package/dist/utilities/getSchemaColumns.js.map +1 -1
- package/dist/utilities/getSchemaColumns.spec.js +157 -0
- package/dist/utilities/getSchemaColumns.spec.js.map +1 -0
- package/dist/utilities/parseCSV.d.ts.map +1 -1
- package/dist/utilities/parseCSV.js +1 -0
- package/dist/utilities/parseCSV.js.map +1 -1
- package/dist/utilities/parseCSV.spec.js +26 -0
- package/dist/utilities/parseCSV.spec.js.map +1 -1
- package/package.json +8 -8
- package/dist/components/ImportCollectionField/index.d.ts +0 -3
- package/dist/components/ImportCollectionField/index.d.ts.map +0 -1
- package/dist/components/ImportCollectionField/index.js +0 -17
- package/dist/components/ImportCollectionField/index.js.map +0 -1
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type
|
|
2
|
-
export declare const CollectionField:
|
|
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,
|
|
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 {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
|
|
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":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ExportListMenuItem/index.tsx"],"names":[],"mappings":"
|
|
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"}
|
|
@@ -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
|
|
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":"
|
|
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":"
|
|
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
|
-
//
|
|
228
|
-
|
|
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
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
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:
|
|
307
|
+
name: fieldName
|
|
309
308
|
},
|
|
310
|
-
Heading: getTranslation(
|
|
309
|
+
Heading: getTranslation(fieldName, i18n),
|
|
311
310
|
renderedCells: docs.map((doc)=>{
|
|
312
|
-
const value = doc[
|
|
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(
|
|
346
|
+
setColumns(finalColumns);
|
|
327
347
|
setDataToRender(docs);
|
|
328
348
|
} catch (err) {
|
|
329
349
|
console.error('Error processing file data:', err);
|