@payloadcms/plugin-import-export 3.52.0-internal.8a9caef → 3.53.0-internal.2dadf5b

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 (177) hide show
  1. package/dist/components/ExportSaveButton/index.d.ts.map +1 -1
  2. package/dist/components/ExportSaveButton/index.js +12 -3
  3. package/dist/components/ExportSaveButton/index.js.map +1 -1
  4. package/dist/components/Page/index.d.ts +4 -0
  5. package/dist/components/Page/index.d.ts.map +1 -0
  6. package/dist/components/Page/index.js +41 -0
  7. package/dist/components/Page/index.js.map +1 -0
  8. package/dist/components/Page/index.scss +3 -0
  9. package/dist/components/Preview/index.d.ts.map +1 -1
  10. package/dist/components/Preview/index.js +5 -0
  11. package/dist/components/Preview/index.js.map +1 -1
  12. package/dist/components/SortBy/index.d.ts +1 -0
  13. package/dist/components/SortBy/index.d.ts.map +1 -1
  14. package/dist/components/SortBy/index.js +64 -22
  15. package/dist/components/SortBy/index.js.map +1 -1
  16. package/dist/components/SortBy/index.scss +1 -2
  17. package/dist/components/SortOrder/index.d.ts +4 -0
  18. package/dist/components/SortOrder/index.d.ts.map +1 -0
  19. package/dist/components/SortOrder/index.js +123 -0
  20. package/dist/components/SortOrder/index.js.map +1 -0
  21. package/dist/components/SortOrder/index.scss +3 -0
  22. package/dist/export/createExport.d.ts +2 -0
  23. package/dist/export/createExport.d.ts.map +1 -1
  24. package/dist/export/createExport.js +66 -15
  25. package/dist/export/createExport.js.map +1 -1
  26. package/dist/export/download.d.ts.map +1 -1
  27. package/dist/export/download.js +34 -16
  28. package/dist/export/download.js.map +1 -1
  29. package/dist/export/flattenObject.d.ts.map +1 -1
  30. package/dist/export/flattenObject.js +32 -20
  31. package/dist/export/flattenObject.js.map +1 -1
  32. package/dist/export/getCustomFieldFunctions.d.ts.map +1 -1
  33. package/dist/export/getCustomFieldFunctions.js +11 -1
  34. package/dist/export/getCustomFieldFunctions.js.map +1 -1
  35. package/dist/export/getFields.d.ts.map +1 -1
  36. package/dist/export/getFields.js +56 -10
  37. package/dist/export/getFields.js.map +1 -1
  38. package/dist/exports/rsc.d.ts +2 -0
  39. package/dist/exports/rsc.d.ts.map +1 -1
  40. package/dist/exports/rsc.js +2 -0
  41. package/dist/exports/rsc.js.map +1 -1
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +3 -2
  44. package/dist/index.js.map +1 -1
  45. package/dist/translations/languages/ar.d.ts.map +1 -1
  46. package/dist/translations/languages/ar.js +2 -0
  47. package/dist/translations/languages/ar.js.map +1 -1
  48. package/dist/translations/languages/az.d.ts.map +1 -1
  49. package/dist/translations/languages/az.js +2 -0
  50. package/dist/translations/languages/az.js.map +1 -1
  51. package/dist/translations/languages/bg.d.ts.map +1 -1
  52. package/dist/translations/languages/bg.js +2 -0
  53. package/dist/translations/languages/bg.js.map +1 -1
  54. package/dist/translations/languages/ca.d.ts.map +1 -1
  55. package/dist/translations/languages/ca.js +2 -0
  56. package/dist/translations/languages/ca.js.map +1 -1
  57. package/dist/translations/languages/cs.d.ts.map +1 -1
  58. package/dist/translations/languages/cs.js +2 -0
  59. package/dist/translations/languages/cs.js.map +1 -1
  60. package/dist/translations/languages/da.d.ts.map +1 -1
  61. package/dist/translations/languages/da.js +2 -0
  62. package/dist/translations/languages/da.js.map +1 -1
  63. package/dist/translations/languages/de.d.ts.map +1 -1
  64. package/dist/translations/languages/de.js +2 -0
  65. package/dist/translations/languages/de.js.map +1 -1
  66. package/dist/translations/languages/en.d.ts +2 -0
  67. package/dist/translations/languages/en.d.ts.map +1 -1
  68. package/dist/translations/languages/en.js +2 -0
  69. package/dist/translations/languages/en.js.map +1 -1
  70. package/dist/translations/languages/es.d.ts.map +1 -1
  71. package/dist/translations/languages/es.js +2 -0
  72. package/dist/translations/languages/es.js.map +1 -1
  73. package/dist/translations/languages/et.d.ts.map +1 -1
  74. package/dist/translations/languages/et.js +2 -0
  75. package/dist/translations/languages/et.js.map +1 -1
  76. package/dist/translations/languages/fa.d.ts.map +1 -1
  77. package/dist/translations/languages/fa.js +2 -0
  78. package/dist/translations/languages/fa.js.map +1 -1
  79. package/dist/translations/languages/fr.d.ts.map +1 -1
  80. package/dist/translations/languages/fr.js +2 -0
  81. package/dist/translations/languages/fr.js.map +1 -1
  82. package/dist/translations/languages/he.d.ts.map +1 -1
  83. package/dist/translations/languages/he.js +2 -0
  84. package/dist/translations/languages/he.js.map +1 -1
  85. package/dist/translations/languages/hr.d.ts.map +1 -1
  86. package/dist/translations/languages/hr.js +2 -0
  87. package/dist/translations/languages/hr.js.map +1 -1
  88. package/dist/translations/languages/hu.d.ts.map +1 -1
  89. package/dist/translations/languages/hu.js +2 -0
  90. package/dist/translations/languages/hu.js.map +1 -1
  91. package/dist/translations/languages/hy.d.ts.map +1 -1
  92. package/dist/translations/languages/hy.js +2 -0
  93. package/dist/translations/languages/hy.js.map +1 -1
  94. package/dist/translations/languages/it.d.ts.map +1 -1
  95. package/dist/translations/languages/it.js +2 -0
  96. package/dist/translations/languages/it.js.map +1 -1
  97. package/dist/translations/languages/ja.d.ts.map +1 -1
  98. package/dist/translations/languages/ja.js +2 -0
  99. package/dist/translations/languages/ja.js.map +1 -1
  100. package/dist/translations/languages/ko.d.ts.map +1 -1
  101. package/dist/translations/languages/ko.js +2 -0
  102. package/dist/translations/languages/ko.js.map +1 -1
  103. package/dist/translations/languages/lt.d.ts.map +1 -1
  104. package/dist/translations/languages/lt.js +2 -0
  105. package/dist/translations/languages/lt.js.map +1 -1
  106. package/dist/translations/languages/lv.d.ts.map +1 -1
  107. package/dist/translations/languages/lv.js +2 -0
  108. package/dist/translations/languages/lv.js.map +1 -1
  109. package/dist/translations/languages/my.d.ts.map +1 -1
  110. package/dist/translations/languages/my.js +2 -0
  111. package/dist/translations/languages/my.js.map +1 -1
  112. package/dist/translations/languages/nb.d.ts.map +1 -1
  113. package/dist/translations/languages/nb.js +2 -0
  114. package/dist/translations/languages/nb.js.map +1 -1
  115. package/dist/translations/languages/nl.d.ts.map +1 -1
  116. package/dist/translations/languages/nl.js +2 -0
  117. package/dist/translations/languages/nl.js.map +1 -1
  118. package/dist/translations/languages/pl.d.ts.map +1 -1
  119. package/dist/translations/languages/pl.js +2 -0
  120. package/dist/translations/languages/pl.js.map +1 -1
  121. package/dist/translations/languages/pt.d.ts.map +1 -1
  122. package/dist/translations/languages/pt.js +2 -0
  123. package/dist/translations/languages/pt.js.map +1 -1
  124. package/dist/translations/languages/ro.d.ts.map +1 -1
  125. package/dist/translations/languages/ro.js +2 -0
  126. package/dist/translations/languages/ro.js.map +1 -1
  127. package/dist/translations/languages/rs.d.ts.map +1 -1
  128. package/dist/translations/languages/rs.js +2 -0
  129. package/dist/translations/languages/rs.js.map +1 -1
  130. package/dist/translations/languages/rsLatin.d.ts.map +1 -1
  131. package/dist/translations/languages/rsLatin.js +2 -0
  132. package/dist/translations/languages/rsLatin.js.map +1 -1
  133. package/dist/translations/languages/ru.d.ts.map +1 -1
  134. package/dist/translations/languages/ru.js +2 -0
  135. package/dist/translations/languages/ru.js.map +1 -1
  136. package/dist/translations/languages/sk.d.ts.map +1 -1
  137. package/dist/translations/languages/sk.js +2 -0
  138. package/dist/translations/languages/sk.js.map +1 -1
  139. package/dist/translations/languages/sl.d.ts.map +1 -1
  140. package/dist/translations/languages/sl.js +2 -0
  141. package/dist/translations/languages/sl.js.map +1 -1
  142. package/dist/translations/languages/sv.d.ts.map +1 -1
  143. package/dist/translations/languages/sv.js +2 -0
  144. package/dist/translations/languages/sv.js.map +1 -1
  145. package/dist/translations/languages/th.d.ts.map +1 -1
  146. package/dist/translations/languages/th.js +2 -0
  147. package/dist/translations/languages/th.js.map +1 -1
  148. package/dist/translations/languages/tr.d.ts.map +1 -1
  149. package/dist/translations/languages/tr.js +2 -0
  150. package/dist/translations/languages/tr.js.map +1 -1
  151. package/dist/translations/languages/translation-schema.json +7 -0
  152. package/dist/translations/languages/uk.d.ts.map +1 -1
  153. package/dist/translations/languages/uk.js +2 -0
  154. package/dist/translations/languages/uk.js.map +1 -1
  155. package/dist/translations/languages/vi.d.ts.map +1 -1
  156. package/dist/translations/languages/vi.js +2 -0
  157. package/dist/translations/languages/vi.js.map +1 -1
  158. package/dist/translations/languages/zh.d.ts.map +1 -1
  159. package/dist/translations/languages/zh.js +2 -0
  160. package/dist/translations/languages/zh.js.map +1 -1
  161. package/dist/translations/languages/zhTw.d.ts.map +1 -1
  162. package/dist/translations/languages/zhTw.js +2 -0
  163. package/dist/translations/languages/zhTw.js.map +1 -1
  164. package/dist/translations/types.d.ts +2 -0
  165. package/dist/translations/types.d.ts.map +1 -1
  166. package/dist/translations/types.js.map +1 -1
  167. package/dist/utilities/getFlattenedFieldKeys.js +1 -1
  168. package/dist/utilities/getFlattenedFieldKeys.js.map +1 -1
  169. package/dist/utilities/sortHelpers.d.ts +6 -0
  170. package/dist/utilities/sortHelpers.d.ts.map +1 -0
  171. package/dist/utilities/sortHelpers.js +14 -0
  172. package/dist/utilities/sortHelpers.js.map +1 -0
  173. package/dist/utilities/validateLimitValue.d.ts +3 -0
  174. package/dist/utilities/validateLimitValue.d.ts.map +1 -0
  175. package/dist/utilities/validateLimitValue.js +15 -0
  176. package/dist/utilities/validateLimitValue.js.map +1 -0
  177. package/package.json +8 -8
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ExportSaveButton/index.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,MAAM,OAAO,CAAA;AAOzB,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAiGpC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ExportSaveButton/index.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,MAAM,OAAO,CAAA;AAOzB,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EA0GpC,CAAA"}
@@ -43,7 +43,17 @@ export const ExportSaveButton = ()=>{
43
43
  toast.dismiss(toastID);
44
44
  }
45
45
  if (!response.ok) {
46
- throw new Error('Failed to download file');
46
+ // Try to parse the error message from the JSON response
47
+ let errorMsg = 'Failed to download file';
48
+ try {
49
+ const errorJson = await response.json();
50
+ if (errorJson?.errors?.[0]?.message) {
51
+ errorMsg = errorJson.errors[0].message;
52
+ }
53
+ } catch {
54
+ // Ignore JSON parse errors, fallback to generic message
55
+ }
56
+ throw new Error(errorMsg);
47
57
  }
48
58
  const fileStream = response.body;
49
59
  const reader = fileStream?.getReader();
@@ -72,8 +82,7 @@ export const ExportSaveButton = ()=>{
72
82
  document.body.removeChild(a);
73
83
  URL.revokeObjectURL(url);
74
84
  } catch (error) {
75
- console.error('Error downloading file:', error);
76
- toast.error('Error downloading file');
85
+ toast.error(error.message || 'Error downloading file');
77
86
  }
78
87
  };
79
88
  return /*#__PURE__*/ _jsxs(React.Fragment, {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/ExportSaveButton/index.tsx"],"sourcesContent":["'use client'\n\nimport {\n Button,\n SaveButton,\n toast,\n Translation,\n useConfig,\n useForm,\n useFormModified,\n useTranslation,\n} from '@payloadcms/ui'\nimport React from 'react'\n\nimport type {\n PluginImportExportTranslationKeys,\n PluginImportExportTranslations,\n} from '../../translations/index.js'\n\nexport const ExportSaveButton: React.FC = () => {\n const { t } = useTranslation<PluginImportExportTranslations, PluginImportExportTranslationKeys>()\n const {\n config: {\n routes: { api },\n serverURL,\n },\n getEntityConfig,\n } = useConfig()\n\n const { getData, setModified } = useForm()\n const modified = useFormModified()\n\n const exportsCollectionConfig = getEntityConfig({ collectionSlug: 'exports' })\n\n const disableSave = exportsCollectionConfig?.admin?.custom?.disableSave === true\n\n const disableDownload = exportsCollectionConfig?.admin?.custom?.disableDownload === true\n\n const label = t('general:save')\n\n const handleDownload = async () => {\n let timeoutID: null | ReturnType<typeof setTimeout> = null\n let toastID: null | number | string = null\n\n try {\n setModified(false) // Reset modified state\n const data = getData()\n\n // Set a timeout to show toast if the request takes longer than 200ms\n timeoutID = setTimeout(() => {\n toastID = toast.success('Your export is being processed...')\n }, 200)\n\n const response = await fetch(`${serverURL}${api}/exports/download`, {\n body: JSON.stringify({\n data,\n }),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n\n // Clear the timeout if fetch completes quickly\n if (timeoutID) {\n clearTimeout(timeoutID)\n }\n\n // Dismiss the toast if it was shown\n if (toastID) {\n toast.dismiss(toastID)\n }\n\n if (!response.ok) {\n throw new Error('Failed to download file')\n }\n\n const fileStream = response.body\n const reader = fileStream?.getReader()\n const decoder = new TextDecoder()\n let result = ''\n\n while (reader) {\n const { done, value } = await reader.read()\n if (done) {\n break\n }\n result += decoder.decode(value, { stream: true })\n }\n\n const blob = new Blob([result], { type: 'text/plain' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = `${data.name}.${data.format}`\n document.body.appendChild(a)\n a.click()\n document.body.removeChild(a)\n URL.revokeObjectURL(url)\n } catch (error) {\n console.error('Error downloading file:', error)\n toast.error('Error downloading file')\n }\n }\n\n return (\n <React.Fragment>\n {!disableSave && <SaveButton label={label} />}\n {!disableDownload && (\n <Button disabled={!modified} onClick={handleDownload} size=\"medium\" type=\"button\">\n <Translation i18nKey=\"upload:download\" t={t} />\n </Button>\n )}\n </React.Fragment>\n )\n}\n"],"names":["Button","SaveButton","toast","Translation","useConfig","useForm","useFormModified","useTranslation","React","ExportSaveButton","t","config","routes","api","serverURL","getEntityConfig","getData","setModified","modified","exportsCollectionConfig","collectionSlug","disableSave","admin","custom","disableDownload","label","handleDownload","timeoutID","toastID","data","setTimeout","success","response","fetch","body","JSON","stringify","credentials","headers","method","clearTimeout","dismiss","ok","Error","fileStream","reader","getReader","decoder","TextDecoder","result","done","value","read","decode","stream","blob","Blob","type","url","URL","createObjectURL","a","document","createElement","href","download","name","format","appendChild","click","removeChild","revokeObjectURL","error","console","Fragment","disabled","onClick","size","i18nKey"],"mappings":"AAAA;;AAEA,SACEA,MAAM,EACNC,UAAU,EACVC,KAAK,EACLC,WAAW,EACXC,SAAS,EACTC,OAAO,EACPC,eAAe,EACfC,cAAc,QACT,iBAAgB;AACvB,OAAOC,WAAW,QAAO;AAOzB,OAAO,MAAMC,mBAA6B;IACxC,MAAM,EAAEC,CAAC,EAAE,GAAGH;IACd,MAAM,EACJI,QAAQ,EACNC,QAAQ,EAAEC,GAAG,EAAE,EACfC,SAAS,EACV,EACDC,eAAe,EAChB,GAAGX;IAEJ,MAAM,EAAEY,OAAO,EAAEC,WAAW,EAAE,GAAGZ;IACjC,MAAMa,WAAWZ;IAEjB,MAAMa,0BAA0BJ,gBAAgB;QAAEK,gBAAgB;IAAU;IAE5E,MAAMC,cAAcF,yBAAyBG,OAAOC,QAAQF,gBAAgB;IAE5E,MAAMG,kBAAkBL,yBAAyBG,OAAOC,QAAQC,oBAAoB;IAEpF,MAAMC,QAAQf,EAAE;IAEhB,MAAMgB,iBAAiB;QACrB,IAAIC,YAAkD;QACtD,IAAIC,UAAkC;QAEtC,IAAI;YACFX,YAAY,OAAO,uBAAuB;;YAC1C,MAAMY,OAAOb;YAEb,qEAAqE;YACrEW,YAAYG,WAAW;gBACrBF,UAAU1B,MAAM6B,OAAO,CAAC;YAC1B,GAAG;YAEH,MAAMC,WAAW,MAAMC,MAAM,GAAGnB,YAAYD,IAAI,iBAAiB,CAAC,EAAE;gBAClEqB,MAAMC,KAAKC,SAAS,CAAC;oBACnBP;gBACF;gBACAQ,aAAa;gBACbC,SAAS;oBACP,gBAAgB;gBAClB;gBACAC,QAAQ;YACV;YAEA,+CAA+C;YAC/C,IAAIZ,WAAW;gBACba,aAAab;YACf;YAEA,oCAAoC;YACpC,IAAIC,SAAS;gBACX1B,MAAMuC,OAAO,CAACb;YAChB;YAEA,IAAI,CAACI,SAASU,EAAE,EAAE;gBAChB,MAAM,IAAIC,MAAM;YAClB;YAEA,MAAMC,aAAaZ,SAASE,IAAI;YAChC,MAAMW,SAASD,YAAYE;YAC3B,MAAMC,UAAU,IAAIC;YACpB,IAAIC,SAAS;YAEb,MAAOJ,OAAQ;gBACb,MAAM,EAAEK,IAAI,EAAEC,KAAK,EAAE,GAAG,MAAMN,OAAOO,IAAI;gBACzC,IAAIF,MAAM;oBACR;gBACF;gBACAD,UAAUF,QAAQM,MAAM,CAACF,OAAO;oBAAEG,QAAQ;gBAAK;YACjD;YAEA,MAAMC,OAAO,IAAIC,KAAK;gBAACP;aAAO,EAAE;gBAAEQ,MAAM;YAAa;YACrD,MAAMC,MAAMC,IAAIC,eAAe,CAACL;YAChC,MAAMM,IAAIC,SAASC,aAAa,CAAC;YACjCF,EAAEG,IAAI,GAAGN;YACTG,EAAEI,QAAQ,GAAG,GAAGpC,KAAKqC,IAAI,CAAC,CAAC,EAAErC,KAAKsC,MAAM,EAAE;YAC1CL,SAAS5B,IAAI,CAACkC,WAAW,CAACP;YAC1BA,EAAEQ,KAAK;YACPP,SAAS5B,IAAI,CAACoC,WAAW,CAACT;YAC1BF,IAAIY,eAAe,CAACb;QACtB,EAAE,OAAOc,OAAO;YACdC,QAAQD,KAAK,CAAC,2BAA2BA;YACzCtE,MAAMsE,KAAK,CAAC;QACd;IACF;IAEA,qBACE,MAAChE,MAAMkE,QAAQ;;YACZ,CAACrD,6BAAe,KAACpB;gBAAWwB,OAAOA;;YACnC,CAACD,iCACA,KAACxB;gBAAO2E,UAAU,CAACzD;gBAAU0D,SAASlD;gBAAgBmD,MAAK;gBAASpB,MAAK;0BACvE,cAAA,KAACtD;oBAAY2E,SAAQ;oBAAkBpE,GAAGA;;;;;AAKpD,EAAC"}
1
+ {"version":3,"sources":["../../../src/components/ExportSaveButton/index.tsx"],"sourcesContent":["'use client'\n\nimport {\n Button,\n SaveButton,\n toast,\n Translation,\n useConfig,\n useForm,\n useFormModified,\n useTranslation,\n} from '@payloadcms/ui'\nimport React from 'react'\n\nimport type {\n PluginImportExportTranslationKeys,\n PluginImportExportTranslations,\n} from '../../translations/index.js'\n\nexport const ExportSaveButton: React.FC = () => {\n const { t } = useTranslation<PluginImportExportTranslations, PluginImportExportTranslationKeys>()\n const {\n config: {\n routes: { api },\n serverURL,\n },\n getEntityConfig,\n } = useConfig()\n\n const { getData, setModified } = useForm()\n const modified = useFormModified()\n\n const exportsCollectionConfig = getEntityConfig({ collectionSlug: 'exports' })\n\n const disableSave = exportsCollectionConfig?.admin?.custom?.disableSave === true\n\n const disableDownload = exportsCollectionConfig?.admin?.custom?.disableDownload === true\n\n const label = t('general:save')\n\n const handleDownload = async () => {\n let timeoutID: null | ReturnType<typeof setTimeout> = null\n let toastID: null | number | string = null\n\n try {\n setModified(false) // Reset modified state\n const data = getData()\n\n // Set a timeout to show toast if the request takes longer than 200ms\n timeoutID = setTimeout(() => {\n toastID = toast.success('Your export is being processed...')\n }, 200)\n\n const response = await fetch(`${serverURL}${api}/exports/download`, {\n body: JSON.stringify({\n data,\n }),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n\n // Clear the timeout if fetch completes quickly\n if (timeoutID) {\n clearTimeout(timeoutID)\n }\n\n // Dismiss the toast if it was shown\n if (toastID) {\n toast.dismiss(toastID)\n }\n\n if (!response.ok) {\n // Try to parse the error message from the JSON response\n let errorMsg = 'Failed to download file'\n try {\n const errorJson = await response.json()\n if (errorJson?.errors?.[0]?.message) {\n errorMsg = errorJson.errors[0].message\n }\n } catch {\n // Ignore JSON parse errors, fallback to generic message\n }\n throw new Error(errorMsg)\n }\n\n const fileStream = response.body\n const reader = fileStream?.getReader()\n const decoder = new TextDecoder()\n let result = ''\n\n while (reader) {\n const { done, value } = await reader.read()\n if (done) {\n break\n }\n result += decoder.decode(value, { stream: true })\n }\n\n const blob = new Blob([result], { type: 'text/plain' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = `${data.name}.${data.format}`\n document.body.appendChild(a)\n a.click()\n document.body.removeChild(a)\n URL.revokeObjectURL(url)\n } catch (error: any) {\n toast.error(error.message || 'Error downloading file')\n }\n }\n\n return (\n <React.Fragment>\n {!disableSave && <SaveButton label={label} />}\n {!disableDownload && (\n <Button disabled={!modified} onClick={handleDownload} size=\"medium\" type=\"button\">\n <Translation i18nKey=\"upload:download\" t={t} />\n </Button>\n )}\n </React.Fragment>\n )\n}\n"],"names":["Button","SaveButton","toast","Translation","useConfig","useForm","useFormModified","useTranslation","React","ExportSaveButton","t","config","routes","api","serverURL","getEntityConfig","getData","setModified","modified","exportsCollectionConfig","collectionSlug","disableSave","admin","custom","disableDownload","label","handleDownload","timeoutID","toastID","data","setTimeout","success","response","fetch","body","JSON","stringify","credentials","headers","method","clearTimeout","dismiss","ok","errorMsg","errorJson","json","errors","message","Error","fileStream","reader","getReader","decoder","TextDecoder","result","done","value","read","decode","stream","blob","Blob","type","url","URL","createObjectURL","a","document","createElement","href","download","name","format","appendChild","click","removeChild","revokeObjectURL","error","Fragment","disabled","onClick","size","i18nKey"],"mappings":"AAAA;;AAEA,SACEA,MAAM,EACNC,UAAU,EACVC,KAAK,EACLC,WAAW,EACXC,SAAS,EACTC,OAAO,EACPC,eAAe,EACfC,cAAc,QACT,iBAAgB;AACvB,OAAOC,WAAW,QAAO;AAOzB,OAAO,MAAMC,mBAA6B;IACxC,MAAM,EAAEC,CAAC,EAAE,GAAGH;IACd,MAAM,EACJI,QAAQ,EACNC,QAAQ,EAAEC,GAAG,EAAE,EACfC,SAAS,EACV,EACDC,eAAe,EAChB,GAAGX;IAEJ,MAAM,EAAEY,OAAO,EAAEC,WAAW,EAAE,GAAGZ;IACjC,MAAMa,WAAWZ;IAEjB,MAAMa,0BAA0BJ,gBAAgB;QAAEK,gBAAgB;IAAU;IAE5E,MAAMC,cAAcF,yBAAyBG,OAAOC,QAAQF,gBAAgB;IAE5E,MAAMG,kBAAkBL,yBAAyBG,OAAOC,QAAQC,oBAAoB;IAEpF,MAAMC,QAAQf,EAAE;IAEhB,MAAMgB,iBAAiB;QACrB,IAAIC,YAAkD;QACtD,IAAIC,UAAkC;QAEtC,IAAI;YACFX,YAAY,OAAO,uBAAuB;;YAC1C,MAAMY,OAAOb;YAEb,qEAAqE;YACrEW,YAAYG,WAAW;gBACrBF,UAAU1B,MAAM6B,OAAO,CAAC;YAC1B,GAAG;YAEH,MAAMC,WAAW,MAAMC,MAAM,GAAGnB,YAAYD,IAAI,iBAAiB,CAAC,EAAE;gBAClEqB,MAAMC,KAAKC,SAAS,CAAC;oBACnBP;gBACF;gBACAQ,aAAa;gBACbC,SAAS;oBACP,gBAAgB;gBAClB;gBACAC,QAAQ;YACV;YAEA,+CAA+C;YAC/C,IAAIZ,WAAW;gBACba,aAAab;YACf;YAEA,oCAAoC;YACpC,IAAIC,SAAS;gBACX1B,MAAMuC,OAAO,CAACb;YAChB;YAEA,IAAI,CAACI,SAASU,EAAE,EAAE;gBAChB,wDAAwD;gBACxD,IAAIC,WAAW;gBACf,IAAI;oBACF,MAAMC,YAAY,MAAMZ,SAASa,IAAI;oBACrC,IAAID,WAAWE,QAAQ,CAAC,EAAE,EAAEC,SAAS;wBACnCJ,WAAWC,UAAUE,MAAM,CAAC,EAAE,CAACC,OAAO;oBACxC;gBACF,EAAE,OAAM;gBACN,wDAAwD;gBAC1D;gBACA,MAAM,IAAIC,MAAML;YAClB;YAEA,MAAMM,aAAajB,SAASE,IAAI;YAChC,MAAMgB,SAASD,YAAYE;YAC3B,MAAMC,UAAU,IAAIC;YACpB,IAAIC,SAAS;YAEb,MAAOJ,OAAQ;gBACb,MAAM,EAAEK,IAAI,EAAEC,KAAK,EAAE,GAAG,MAAMN,OAAOO,IAAI;gBACzC,IAAIF,MAAM;oBACR;gBACF;gBACAD,UAAUF,QAAQM,MAAM,CAACF,OAAO;oBAAEG,QAAQ;gBAAK;YACjD;YAEA,MAAMC,OAAO,IAAIC,KAAK;gBAACP;aAAO,EAAE;gBAAEQ,MAAM;YAAa;YACrD,MAAMC,MAAMC,IAAIC,eAAe,CAACL;YAChC,MAAMM,IAAIC,SAASC,aAAa,CAAC;YACjCF,EAAEG,IAAI,GAAGN;YACTG,EAAEI,QAAQ,GAAG,GAAGzC,KAAK0C,IAAI,CAAC,CAAC,EAAE1C,KAAK2C,MAAM,EAAE;YAC1CL,SAASjC,IAAI,CAACuC,WAAW,CAACP;YAC1BA,EAAEQ,KAAK;YACPP,SAASjC,IAAI,CAACyC,WAAW,CAACT;YAC1BF,IAAIY,eAAe,CAACb;QACtB,EAAE,OAAOc,OAAY;YACnB3E,MAAM2E,KAAK,CAACA,MAAM9B,OAAO,IAAI;QAC/B;IACF;IAEA,qBACE,MAACvC,MAAMsE,QAAQ;;YACZ,CAACzD,6BAAe,KAACpB;gBAAWwB,OAAOA;;YACnC,CAACD,iCACA,KAACxB;gBAAO+E,UAAU,CAAC7D;gBAAU8D,SAAStD;gBAAgBuD,MAAK;gBAASnB,MAAK;0BACvE,cAAA,KAAC3D;oBAAY+E,SAAQ;oBAAkBxE,GAAGA;;;;;AAKpD,EAAC"}
@@ -0,0 +1,4 @@
1
+ import type { NumberFieldClientComponent } from 'payload';
2
+ import './index.scss';
3
+ export declare const Page: NumberFieldClientComponent;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Page/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAA;AAKzD,OAAO,cAAc,CAAA;AAIrB,eAAO,MAAM,IAAI,EAAE,0BA6BlB,CAAA"}
@@ -0,0 +1,41 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { NumberField, useField } from '@payloadcms/ui';
4
+ import React, { useEffect } from 'react';
5
+ import './index.scss';
6
+ const baseClass = 'page-field';
7
+ export const Page = (props)=>{
8
+ const { setValue } = useField();
9
+ const { value: limitValue } = useField({
10
+ path: 'limit'
11
+ });
12
+ // Effect to reset page to 1 if limit is removed
13
+ useEffect(()=>{
14
+ if (!limitValue) {
15
+ setValue(1) // Reset page to 1
16
+ ;
17
+ }
18
+ }, [
19
+ limitValue,
20
+ setValue
21
+ ]);
22
+ return /*#__PURE__*/ _jsx("div", {
23
+ className: baseClass,
24
+ children: /*#__PURE__*/ _jsx(NumberField, {
25
+ field: {
26
+ name: props.field.name,
27
+ admin: {
28
+ autoComplete: undefined,
29
+ placeholder: undefined,
30
+ step: 1
31
+ },
32
+ label: props.field.label,
33
+ min: 1
34
+ },
35
+ onChange: (value)=>setValue(value ?? 1),
36
+ path: props.path
37
+ })
38
+ });
39
+ };
40
+
41
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/Page/index.tsx"],"sourcesContent":["'use client'\n\nimport type { NumberFieldClientComponent } from 'payload'\n\nimport { NumberField, useField } from '@payloadcms/ui'\nimport React, { useEffect } from 'react'\n\nimport './index.scss'\n\nconst baseClass = 'page-field'\n\nexport const Page: NumberFieldClientComponent = (props) => {\n const { setValue } = useField<number>()\n const { value: limitValue } = useField<number>({ path: 'limit' })\n\n // Effect to reset page to 1 if limit is removed\n useEffect(() => {\n if (!limitValue) {\n setValue(1) // Reset page to 1\n }\n }, [limitValue, setValue])\n\n return (\n <div className={baseClass}>\n <NumberField\n field={{\n name: props.field.name,\n admin: {\n autoComplete: undefined,\n placeholder: undefined,\n step: 1,\n },\n label: props.field.label,\n min: 1,\n }}\n onChange={(value) => setValue(value ?? 1)} // Update the page value on change\n path={props.path}\n />\n </div>\n )\n}\n"],"names":["NumberField","useField","React","useEffect","baseClass","Page","props","setValue","value","limitValue","path","div","className","field","name","admin","autoComplete","undefined","placeholder","step","label","min","onChange"],"mappings":"AAAA;;AAIA,SAASA,WAAW,EAAEC,QAAQ,QAAQ,iBAAgB;AACtD,OAAOC,SAASC,SAAS,QAAQ,QAAO;AAExC,OAAO,eAAc;AAErB,MAAMC,YAAY;AAElB,OAAO,MAAMC,OAAmC,CAACC;IAC/C,MAAM,EAAEC,QAAQ,EAAE,GAAGN;IACrB,MAAM,EAAEO,OAAOC,UAAU,EAAE,GAAGR,SAAiB;QAAES,MAAM;IAAQ;IAE/D,gDAAgD;IAChDP,UAAU;QACR,IAAI,CAACM,YAAY;YACfF,SAAS,GAAG,kBAAkB;;QAChC;IACF,GAAG;QAACE;QAAYF;KAAS;IAEzB,qBACE,KAACI;QAAIC,WAAWR;kBACd,cAAA,KAACJ;YACCa,OAAO;gBACLC,MAAMR,MAAMO,KAAK,CAACC,IAAI;gBACtBC,OAAO;oBACLC,cAAcC;oBACdC,aAAaD;oBACbE,MAAM;gBACR;gBACAC,OAAOd,MAAMO,KAAK,CAACO,KAAK;gBACxBC,KAAK;YACP;YACAC,UAAU,CAACd,QAAUD,SAASC,SAAS;YACvCE,MAAMJ,MAAMI,IAAI;;;AAIxB,EAAC"}
@@ -0,0 +1,3 @@
1
+ .page-field {
2
+ --field-width: 33.3333%;
3
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Preview/index.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,MAAM,OAAO,CAAA;AAQzB,OAAO,cAAc,CAAA;AAKrB,eAAO,MAAM,OAAO,yBA8KnB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Preview/index.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,MAAM,OAAO,CAAA;AAQzB,OAAO,cAAc,CAAA;AAKrB,eAAO,MAAM,OAAO,yBAiLnB,CAAA"}
@@ -13,6 +13,9 @@ export const Preview = ()=>{
13
13
  const { value: where } = useField({
14
14
  path: 'where'
15
15
  });
16
+ const { value: page } = useField({
17
+ path: 'page'
18
+ });
16
19
  const { value: limit } = useField({
17
20
  path: 'limit'
18
21
  });
@@ -58,6 +61,7 @@ export const Preview = ()=>{
58
61
  format,
59
62
  limit,
60
63
  locale,
64
+ page,
61
65
  sort,
62
66
  where
63
67
  }),
@@ -134,6 +138,7 @@ export const Preview = ()=>{
134
138
  i18n,
135
139
  limit,
136
140
  locale,
141
+ page,
137
142
  sort,
138
143
  where
139
144
  ]);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/Preview/index.tsx"],"sourcesContent":["'use client'\nimport type { Column } from '@payloadcms/ui'\nimport type { ClientField } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n CodeEditorLazy,\n Table,\n Translation,\n useConfig,\n useField,\n useTranslation,\n} from '@payloadcms/ui'\nimport React from 'react'\n\nimport type {\n PluginImportExportTranslationKeys,\n PluginImportExportTranslations,\n} from '../../translations/index.js'\n\nimport { buildDisabledFieldRegex } from '../../utilities/buildDisabledFieldRegex.js'\nimport './index.scss'\nimport { useImportExport } from '../ImportExportProvider/index.js'\n\nconst baseClass = 'preview'\n\nexport const Preview = () => {\n const { collection } = useImportExport()\n const { config } = useConfig()\n const { value: where } = useField({ path: 'where' })\n const { value: limit } = useField<number>({ path: 'limit' })\n const { value: fields } = useField<string[]>({ path: 'fields' })\n const { value: sort } = useField({ path: 'sort' })\n const { value: draft } = useField({ path: 'drafts' })\n const { value: locale } = useField({ path: 'locale' })\n const { value: format } = useField({ path: 'format' })\n const [dataToRender, setDataToRender] = React.useState<any[]>([])\n const [resultCount, setResultCount] = React.useState<any>('')\n const [columns, setColumns] = React.useState<Column[]>([])\n const { i18n, t } = useTranslation<\n PluginImportExportTranslations,\n PluginImportExportTranslationKeys\n >()\n\n const collectionSlug = typeof collection === 'string' && collection\n const collectionConfig = config.collections.find(\n (collection) => collection.slug === collectionSlug,\n )\n\n const disabledFieldRegexes: RegExp[] = React.useMemo(() => {\n const disabledFieldPaths =\n collectionConfig?.admin?.custom?.['plugin-import-export']?.disabledFields ?? []\n\n return disabledFieldPaths.map(buildDisabledFieldRegex)\n }, [collectionConfig])\n\n const isCSV = format === 'csv'\n\n React.useEffect(() => {\n const fetchData = async () => {\n if (!collectionSlug || !collectionConfig) {\n return\n }\n\n try {\n const res = await fetch('/api/preview-data', {\n body: JSON.stringify({\n collectionSlug,\n draft,\n fields,\n format,\n limit,\n locale,\n sort,\n where,\n }),\n credentials: 'include',\n headers: { 'Content-Type': 'application/json' },\n method: 'POST',\n })\n\n if (!res.ok) {\n return\n }\n\n const { docs, totalDocs }: { docs: Record<string, unknown>[]; totalDocs: number } =\n await res.json()\n\n setResultCount(limit && limit < totalDocs ? limit : totalDocs)\n\n const allKeys = Array.from(new Set(docs.flatMap((doc) => Object.keys(doc))))\n const defaultMetaFields = ['createdAt', 'updatedAt', '_status', 'id']\n\n // Match CSV column ordering by building keys based on fields and regex\n const fieldToRegex = (field: string): RegExp => {\n const parts = field.split('.').map((part) => `${part}(?:_\\\\d+)?`)\n return new RegExp(`^${parts.join('_')}`)\n }\n\n // Construct final list of field keys to match field order + meta order\n const selectedKeys =\n Array.isArray(fields) && fields.length > 0\n ? fields.flatMap((field) => {\n const regex = fieldToRegex(field)\n return allKeys.filter(\n (key) =>\n regex.test(key) &&\n !disabledFieldRegexes.some((disabledRegex) => disabledRegex.test(key)),\n )\n })\n : allKeys.filter(\n (key) =>\n !defaultMetaFields.includes(key) &&\n !disabledFieldRegexes.some((regex) => regex.test(key)),\n )\n\n const fieldKeys =\n Array.isArray(fields) && fields.length > 0\n ? selectedKeys // strictly use selected fields only\n : [\n ...selectedKeys,\n ...defaultMetaFields.filter(\n (key) => allKeys.includes(key) && !selectedKeys.includes(key),\n ),\n ]\n\n // Build columns based on flattened 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 setColumns(newColumns)\n setDataToRender(docs)\n } catch (error) {\n console.error('Error fetching preview data:', error)\n }\n }\n\n void fetchData()\n }, [\n collectionConfig,\n collectionSlug,\n disabledFieldRegexes,\n draft,\n fields,\n format,\n i18n,\n limit,\n locale,\n sort,\n where,\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 {resultCount && (\n <Translation\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n i18nKey=\"plugin-import-export:totalDocumentsCount\"\n t={t}\n variables={{\n count: resultCount,\n }}\n />\n )}\n </div>\n {dataToRender &&\n (isCSV ? (\n <Table columns={columns} data={dataToRender} />\n ) : (\n <CodeEditorLazy language=\"json\" readOnly value={JSON.stringify(dataToRender, null, 2)} />\n ))}\n </div>\n )\n}\n"],"names":["getTranslation","CodeEditorLazy","Table","Translation","useConfig","useField","useTranslation","React","buildDisabledFieldRegex","useImportExport","baseClass","Preview","collection","config","value","where","path","limit","fields","sort","draft","locale","format","dataToRender","setDataToRender","useState","resultCount","setResultCount","columns","setColumns","i18n","t","collectionSlug","collectionConfig","collections","find","slug","disabledFieldRegexes","useMemo","disabledFieldPaths","admin","custom","disabledFields","map","isCSV","useEffect","fetchData","res","fetch","body","JSON","stringify","credentials","headers","method","ok","docs","totalDocs","json","allKeys","Array","from","Set","flatMap","doc","Object","keys","defaultMetaFields","fieldToRegex","field","parts","split","part","RegExp","join","selectedKeys","isArray","length","regex","filter","key","test","some","disabledRegex","includes","fieldKeys","newColumns","accessor","active","name","Heading","renderedCells","val","undefined","String","error","console","div","className","h3","i18nKey","variables","count","data","language","readOnly"],"mappings":"AAAA;;AAIA,SAASA,cAAc,QAAQ,2BAA0B;AACzD,SACEC,cAAc,EACdC,KAAK,EACLC,WAAW,EACXC,SAAS,EACTC,QAAQ,EACRC,cAAc,QACT,iBAAgB;AACvB,OAAOC,WAAW,QAAO;AAOzB,SAASC,uBAAuB,QAAQ,6CAA4C;AACpF,OAAO,eAAc;AACrB,SAASC,eAAe,QAAQ,mCAAkC;AAElE,MAAMC,YAAY;AAElB,OAAO,MAAMC,UAAU;IACrB,MAAM,EAAEC,UAAU,EAAE,GAAGH;IACvB,MAAM,EAAEI,MAAM,EAAE,GAAGT;IACnB,MAAM,EAAEU,OAAOC,KAAK,EAAE,GAAGV,SAAS;QAAEW,MAAM;IAAQ;IAClD,MAAM,EAAEF,OAAOG,KAAK,EAAE,GAAGZ,SAAiB;QAAEW,MAAM;IAAQ;IAC1D,MAAM,EAAEF,OAAOI,MAAM,EAAE,GAAGb,SAAmB;QAAEW,MAAM;IAAS;IAC9D,MAAM,EAAEF,OAAOK,IAAI,EAAE,GAAGd,SAAS;QAAEW,MAAM;IAAO;IAChD,MAAM,EAAEF,OAAOM,KAAK,EAAE,GAAGf,SAAS;QAAEW,MAAM;IAAS;IACnD,MAAM,EAAEF,OAAOO,MAAM,EAAE,GAAGhB,SAAS;QAAEW,MAAM;IAAS;IACpD,MAAM,EAAEF,OAAOQ,MAAM,EAAE,GAAGjB,SAAS;QAAEW,MAAM;IAAS;IACpD,MAAM,CAACO,cAAcC,gBAAgB,GAAGjB,MAAMkB,QAAQ,CAAQ,EAAE;IAChE,MAAM,CAACC,aAAaC,eAAe,GAAGpB,MAAMkB,QAAQ,CAAM;IAC1D,MAAM,CAACG,SAASC,WAAW,GAAGtB,MAAMkB,QAAQ,CAAW,EAAE;IACzD,MAAM,EAAEK,IAAI,EAAEC,CAAC,EAAE,GAAGzB;IAKpB,MAAM0B,iBAAiB,OAAOpB,eAAe,YAAYA;IACzD,MAAMqB,mBAAmBpB,OAAOqB,WAAW,CAACC,IAAI,CAC9C,CAACvB,aAAeA,WAAWwB,IAAI,KAAKJ;IAGtC,MAAMK,uBAAiC9B,MAAM+B,OAAO,CAAC;QACnD,MAAMC,qBACJN,kBAAkBO,OAAOC,QAAQ,CAAC,uBAAuB,EAAEC,kBAAkB,EAAE;QAEjF,OAAOH,mBAAmBI,GAAG,CAACnC;IAChC,GAAG;QAACyB;KAAiB;IAErB,MAAMW,QAAQtB,WAAW;IAEzBf,MAAMsC,SAAS,CAAC;QACd,MAAMC,YAAY;YAChB,IAAI,CAACd,kBAAkB,CAACC,kBAAkB;gBACxC;YACF;YAEA,IAAI;gBACF,MAAMc,MAAM,MAAMC,MAAM,qBAAqB;oBAC3CC,MAAMC,KAAKC,SAAS,CAAC;wBACnBnB;wBACAZ;wBACAF;wBACAI;wBACAL;wBACAI;wBACAF;wBACAJ;oBACF;oBACAqC,aAAa;oBACbC,SAAS;wBAAE,gBAAgB;oBAAmB;oBAC9CC,QAAQ;gBACV;gBAEA,IAAI,CAACP,IAAIQ,EAAE,EAAE;oBACX;gBACF;gBAEA,MAAM,EAAEC,IAAI,EAAEC,SAAS,EAAE,GACvB,MAAMV,IAAIW,IAAI;gBAEhB/B,eAAeV,SAASA,QAAQwC,YAAYxC,QAAQwC;gBAEpD,MAAME,UAAUC,MAAMC,IAAI,CAAC,IAAIC,IAAIN,KAAKO,OAAO,CAAC,CAACC,MAAQC,OAAOC,IAAI,CAACF;gBACrE,MAAMG,oBAAoB;oBAAC;oBAAa;oBAAa;oBAAW;iBAAK;gBAErE,uEAAuE;gBACvE,MAAMC,eAAe,CAACC;oBACpB,MAAMC,QAAQD,MAAME,KAAK,CAAC,KAAK5B,GAAG,CAAC,CAAC6B,OAAS,GAAGA,KAAK,UAAU,CAAC;oBAChE,OAAO,IAAIC,OAAO,CAAC,CAAC,EAAEH,MAAMI,IAAI,CAAC,MAAM;gBACzC;gBAEA,uEAAuE;gBACvE,MAAMC,eACJf,MAAMgB,OAAO,CAAC1D,WAAWA,OAAO2D,MAAM,GAAG,IACrC3D,OAAO6C,OAAO,CAAC,CAACM;oBACd,MAAMS,QAAQV,aAAaC;oBAC3B,OAAOV,QAAQoB,MAAM,CACnB,CAACC,MACCF,MAAMG,IAAI,CAACD,QACX,CAAC3C,qBAAqB6C,IAAI,CAAC,CAACC,gBAAkBA,cAAcF,IAAI,CAACD;gBAEvE,KACArB,QAAQoB,MAAM,CACZ,CAACC,MACC,CAACb,kBAAkBiB,QAAQ,CAACJ,QAC5B,CAAC3C,qBAAqB6C,IAAI,CAAC,CAACJ,QAAUA,MAAMG,IAAI,CAACD;gBAG3D,MAAMK,YACJzB,MAAMgB,OAAO,CAAC1D,WAAWA,OAAO2D,MAAM,GAAG,IACrCF,aAAa,oCAAoC;mBACjD;uBACKA;uBACAR,kBAAkBY,MAAM,CACzB,CAACC,MAAQrB,QAAQyB,QAAQ,CAACJ,QAAQ,CAACL,aAAaS,QAAQ,CAACJ;iBAE5D;gBAEP,wCAAwC;gBACxC,MAAMM,aAAuBD,UAAU1C,GAAG,CAAC,CAACqC,MAAS,CAAA;wBACnDO,UAAUP;wBACVQ,QAAQ;wBACRnB,OAAO;4BAAEoB,MAAMT;wBAAI;wBACnBU,SAAS1F,eAAegF,KAAKlD;wBAC7B6D,eAAenC,KAAKb,GAAG,CAAC,CAACqB;4BACvB,MAAM4B,MAAM5B,GAAG,CAACgB,IAAI;4BAEpB,IAAIY,QAAQC,aAAaD,QAAQ,MAAM;gCACrC,OAAO;4BACT;4BAEA,gEAAgE;4BAChE,IAAI,OAAOA,QAAQ,YAAY,OAAOA,QAAQ,YAAY,OAAOA,QAAQ,WAAW;gCAClF,OAAOE,OAAOF;4BAChB;4BAEA,IAAIhC,MAAMgB,OAAO,CAACgB,MAAM;gCACtB,OAAOA,IAAIjD,GAAG,CAACmD,QAAQpB,IAAI,CAAC;4BAC9B;4BAEA,OAAOxB,KAAKC,SAAS,CAACyC;wBACxB;oBACF,CAAA;gBAEA/D,WAAWyD;gBACX9D,gBAAgBgC;YAClB,EAAE,OAAOuC,OAAO;gBACdC,QAAQD,KAAK,CAAC,gCAAgCA;YAChD;QACF;QAEA,KAAKjD;IACP,GAAG;QACDb;QACAD;QACAK;QACAjB;QACAF;QACAI;QACAQ;QACAb;QACAI;QACAF;QACAJ;KACD;IAED,qBACE,MAACkF;QAAIC,WAAWxF;;0BACd,MAACuF;gBAAIC,WAAW,GAAGxF,UAAU,QAAQ,CAAC;;kCACpC,KAACyF;kCACC,cAAA,KAAChG;4BAAYiG,SAAQ;4BAAkBrE,GAAGA;;;oBAE3CL,6BACC,KAACvB;wBACC,6DAA6D;wBAC7D,mBAAmB;wBACnBiG,SAAQ;wBACRrE,GAAGA;wBACHsE,WAAW;4BACTC,OAAO5E;wBACT;;;;YAILH,gBACEqB,CAAAA,sBACC,KAAC1C;gBAAM0B,SAASA;gBAAS2E,MAAMhF;+BAE/B,KAACtB;gBAAeuG,UAAS;gBAAOC,QAAQ;gBAAC3F,OAAOoC,KAAKC,SAAS,CAAC5B,cAAc,MAAM;cACrF;;;AAGR,EAAC"}
1
+ {"version":3,"sources":["../../../src/components/Preview/index.tsx"],"sourcesContent":["'use client'\nimport type { Column } from '@payloadcms/ui'\nimport type { ClientField } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n CodeEditorLazy,\n Table,\n Translation,\n useConfig,\n useField,\n useTranslation,\n} from '@payloadcms/ui'\nimport React from 'react'\n\nimport type {\n PluginImportExportTranslationKeys,\n PluginImportExportTranslations,\n} from '../../translations/index.js'\n\nimport { buildDisabledFieldRegex } from '../../utilities/buildDisabledFieldRegex.js'\nimport './index.scss'\nimport { useImportExport } from '../ImportExportProvider/index.js'\n\nconst baseClass = 'preview'\n\nexport const Preview = () => {\n const { collection } = useImportExport()\n const { config } = useConfig()\n const { value: where } = useField({ path: 'where' })\n const { value: page } = useField({ path: 'page' })\n const { value: limit } = useField<number>({ path: 'limit' })\n const { value: fields } = useField<string[]>({ path: 'fields' })\n const { value: sort } = useField({ path: 'sort' })\n const { value: draft } = useField({ path: 'drafts' })\n const { value: locale } = useField({ path: 'locale' })\n const { value: format } = useField({ path: 'format' })\n const [dataToRender, setDataToRender] = React.useState<any[]>([])\n const [resultCount, setResultCount] = React.useState<any>('')\n const [columns, setColumns] = React.useState<Column[]>([])\n const { i18n, t } = useTranslation<\n PluginImportExportTranslations,\n PluginImportExportTranslationKeys\n >()\n\n const collectionSlug = typeof collection === 'string' && collection\n const collectionConfig = config.collections.find(\n (collection) => collection.slug === collectionSlug,\n )\n\n const disabledFieldRegexes: RegExp[] = React.useMemo(() => {\n const disabledFieldPaths =\n collectionConfig?.admin?.custom?.['plugin-import-export']?.disabledFields ?? []\n\n return disabledFieldPaths.map(buildDisabledFieldRegex)\n }, [collectionConfig])\n\n const isCSV = format === 'csv'\n\n React.useEffect(() => {\n const fetchData = async () => {\n if (!collectionSlug || !collectionConfig) {\n return\n }\n\n try {\n const res = await fetch('/api/preview-data', {\n body: JSON.stringify({\n collectionSlug,\n draft,\n fields,\n format,\n limit,\n locale,\n page,\n sort,\n where,\n }),\n credentials: 'include',\n headers: { 'Content-Type': 'application/json' },\n method: 'POST',\n })\n\n if (!res.ok) {\n return\n }\n\n const { docs, totalDocs }: { docs: Record<string, unknown>[]; totalDocs: number } =\n await res.json()\n\n setResultCount(limit && limit < totalDocs ? limit : totalDocs)\n\n const allKeys = Array.from(new Set(docs.flatMap((doc) => Object.keys(doc))))\n const defaultMetaFields = ['createdAt', 'updatedAt', '_status', 'id']\n\n // Match CSV column ordering by building keys based on fields and regex\n const fieldToRegex = (field: string): RegExp => {\n const parts = field.split('.').map((part) => `${part}(?:_\\\\d+)?`)\n return new RegExp(`^${parts.join('_')}`)\n }\n\n // Construct final list of field keys to match field order + meta order\n const selectedKeys =\n Array.isArray(fields) && fields.length > 0\n ? fields.flatMap((field) => {\n const regex = fieldToRegex(field)\n return allKeys.filter(\n (key) =>\n regex.test(key) &&\n !disabledFieldRegexes.some((disabledRegex) => disabledRegex.test(key)),\n )\n })\n : allKeys.filter(\n (key) =>\n !defaultMetaFields.includes(key) &&\n !disabledFieldRegexes.some((regex) => regex.test(key)),\n )\n\n const fieldKeys =\n Array.isArray(fields) && fields.length > 0\n ? selectedKeys // strictly use selected fields only\n : [\n ...selectedKeys,\n ...defaultMetaFields.filter(\n (key) => allKeys.includes(key) && !selectedKeys.includes(key),\n ),\n ]\n\n // Build columns based on flattened 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 setColumns(newColumns)\n setDataToRender(docs)\n } catch (error) {\n console.error('Error fetching preview data:', error)\n }\n }\n\n void fetchData()\n }, [\n collectionConfig,\n collectionSlug,\n disabledFieldRegexes,\n draft,\n fields,\n format,\n i18n,\n limit,\n locale,\n page,\n sort,\n where,\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 {resultCount && (\n <Translation\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n i18nKey=\"plugin-import-export:totalDocumentsCount\"\n t={t}\n variables={{\n count: resultCount,\n }}\n />\n )}\n </div>\n {dataToRender &&\n (isCSV ? (\n <Table columns={columns} data={dataToRender} />\n ) : (\n <CodeEditorLazy language=\"json\" readOnly value={JSON.stringify(dataToRender, null, 2)} />\n ))}\n </div>\n )\n}\n"],"names":["getTranslation","CodeEditorLazy","Table","Translation","useConfig","useField","useTranslation","React","buildDisabledFieldRegex","useImportExport","baseClass","Preview","collection","config","value","where","path","page","limit","fields","sort","draft","locale","format","dataToRender","setDataToRender","useState","resultCount","setResultCount","columns","setColumns","i18n","t","collectionSlug","collectionConfig","collections","find","slug","disabledFieldRegexes","useMemo","disabledFieldPaths","admin","custom","disabledFields","map","isCSV","useEffect","fetchData","res","fetch","body","JSON","stringify","credentials","headers","method","ok","docs","totalDocs","json","allKeys","Array","from","Set","flatMap","doc","Object","keys","defaultMetaFields","fieldToRegex","field","parts","split","part","RegExp","join","selectedKeys","isArray","length","regex","filter","key","test","some","disabledRegex","includes","fieldKeys","newColumns","accessor","active","name","Heading","renderedCells","val","undefined","String","error","console","div","className","h3","i18nKey","variables","count","data","language","readOnly"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
1
  import type { SelectFieldClientComponent } from 'payload';
2
+ import './index.scss';
2
3
  export declare const SortBy: SelectFieldClientComponent;
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/SortBy/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAA;AAkBzD,eAAO,MAAM,MAAM,EAAE,0BAsEpB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/SortBy/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAA;AAgBzD,OAAO,cAAc,CAAA;AAIrB,eAAO,MAAM,MAAM,EAAE,0BAqHpB,CAAA"}
@@ -1,71 +1,113 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { FieldLabel, ReactSelect, useConfig, useDocumentInfo, useField, useListQuery } from '@payloadcms/ui';
4
- import React, { useEffect, useState } from 'react';
4
+ import React, { useEffect, useMemo, useRef, useState } from 'react';
5
+ import { applySortOrder, normalizeQueryParam, stripSortDash } from '../../utilities/sortHelpers.js';
5
6
  import { reduceFields } from '../FieldsToExport/reduceFields.js';
6
7
  import { useImportExport } from '../ImportExportProvider/index.js';
8
+ import './index.scss';
7
9
  const baseClass = 'sort-by-fields';
8
10
  export const SortBy = (props)=>{
9
11
  const { id } = useDocumentInfo();
10
- const { setValue, value } = useField();
12
+ // The "sort" text field that stores 'title' or '-title'
13
+ const { setValue: setSort, value: sortRaw } = useField();
14
+ // Sibling order field ('asc' | 'desc') used when writing sort on change
15
+ const { value: sortOrder = 'asc' } = useField({
16
+ path: 'sortOrder'
17
+ });
18
+ // Needed so we can initialize sortOrder when SortOrder component is hidden
19
+ const { setValue: setSortOrder } = useField({
20
+ path: 'sortOrder'
21
+ });
11
22
  const { value: collectionSlug } = useField({
12
23
  path: 'collectionSlug'
13
24
  });
14
25
  const { query } = useListQuery();
15
26
  const { getEntityConfig } = useConfig();
16
27
  const { collection } = useImportExport();
28
+ // ReactSelect's displayed option
17
29
  const [displayedValue, setDisplayedValue] = useState(null);
18
30
  const collectionConfig = getEntityConfig({
19
31
  collectionSlug: collectionSlug ?? collection
20
32
  });
21
- const fieldOptions = reduceFields({
22
- fields: collectionConfig?.fields
23
- });
24
- // Sync displayedValue with value from useField
33
+ const fieldOptions = useMemo(()=>reduceFields({
34
+ fields: collectionConfig?.fields
35
+ }), [
36
+ collectionConfig?.fields
37
+ ]);
38
+ // Normalize the stored value for display (strip the '-') and pick the option
25
39
  useEffect(()=>{
26
- if (!value) {
40
+ const clean = stripSortDash(sortRaw);
41
+ if (!clean) {
27
42
  setDisplayedValue(null);
28
43
  return;
29
44
  }
30
- const option = fieldOptions.find((field)=>field.value === value);
31
- if (option && (!displayedValue || displayedValue.value !== value)) {
45
+ const option = fieldOptions.find((f)=>f.value === clean);
46
+ if (option && (!displayedValue || displayedValue.value !== clean)) {
32
47
  setDisplayedValue(option);
33
48
  }
34
49
  }, [
35
- displayedValue,
50
+ sortRaw,
36
51
  fieldOptions,
37
- value
52
+ displayedValue
38
53
  ]);
54
+ // One-time init guard so clearing `sort` doesn't rehydrate from query again
55
+ const didInitRef = useRef(false);
56
+ // Sync the visible select from list-view query sort (preferred) or groupBy (fallback)
57
+ // and initialize both `sort` and `sortOrder` here as SortOrder may be hidden by admin.condition.
39
58
  useEffect(()=>{
40
- if (id || !query?.sort || value) {
59
+ if (didInitRef.current) {
60
+ return;
61
+ }
62
+ if (id) {
63
+ didInitRef.current = true;
41
64
  return;
42
65
  }
43
- const option = fieldOptions.find((field)=>field.value === query.sort);
66
+ if (typeof sortRaw === 'string' && sortRaw.length > 0) {
67
+ // Already initialized elsewhere
68
+ didInitRef.current = true;
69
+ return;
70
+ }
71
+ const qsSort = normalizeQueryParam(query?.sort);
72
+ const qsGroupBy = normalizeQueryParam(query?.groupBy);
73
+ const source = qsSort ?? qsGroupBy;
74
+ if (!source) {
75
+ didInitRef.current = true;
76
+ return;
77
+ }
78
+ const isDesc = !!qsSort && qsSort.startsWith('-');
79
+ const base = stripSortDash(source);
80
+ const order = isDesc ? 'desc' : 'asc';
81
+ // Write BOTH fields so preview/export have the right values even if SortOrder is hidden
82
+ setSort(applySortOrder(base, order));
83
+ setSortOrder(order);
84
+ const option = fieldOptions.find((f)=>f.value === base);
44
85
  if (option) {
45
- setValue(option.value);
46
86
  setDisplayedValue(option);
47
87
  }
88
+ didInitRef.current = true;
48
89
  }, [
49
- fieldOptions,
50
90
  id,
91
+ query?.groupBy,
51
92
  query?.sort,
52
- value,
53
- setValue
93
+ sortRaw,
94
+ fieldOptions,
95
+ setSort,
96
+ setSortOrder
54
97
  ]);
98
+ // When user selects a different field, store it with the current order applied
55
99
  const onChange = (option)=>{
56
100
  if (!option) {
57
- setValue('');
101
+ setSort('');
58
102
  setDisplayedValue(null);
59
103
  } else {
60
- setValue(option.value);
61
104
  setDisplayedValue(option);
105
+ const next = applySortOrder(option.value, String(sortOrder));
106
+ setSort(next);
62
107
  }
63
108
  };
64
109
  return /*#__PURE__*/ _jsxs("div", {
65
110
  className: baseClass,
66
- style: {
67
- '--field-width': '33%'
68
- },
69
111
  children: [
70
112
  /*#__PURE__*/ _jsx(FieldLabel, {
71
113
  label: props.field.label,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/SortBy/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, useState } from 'react'\n\nimport { reduceFields } from '../FieldsToExport/reduceFields.js'\nimport { useImportExport } from '../ImportExportProvider/index.js'\n\nconst baseClass = 'sort-by-fields'\n\nexport const SortBy: SelectFieldClientComponent = (props) => {\n const { id } = useDocumentInfo()\n const { setValue, value } = useField<string>()\n const { value: collectionSlug } = useField<string>({ path: 'collectionSlug' })\n const { query } = useListQuery()\n const { getEntityConfig } = useConfig()\n const { collection } = useImportExport()\n\n const [displayedValue, setDisplayedValue] = useState<{\n id: string\n label: ReactNode\n value: string\n } | null>(null)\n\n const collectionConfig = getEntityConfig({ collectionSlug: collectionSlug ?? collection })\n const fieldOptions = reduceFields({ fields: collectionConfig?.fields })\n\n // Sync displayedValue with value from useField\n useEffect(() => {\n if (!value) {\n setDisplayedValue(null)\n return\n }\n\n const option = fieldOptions.find((field) => field.value === value)\n if (option && (!displayedValue || displayedValue.value !== value)) {\n setDisplayedValue(option)\n }\n }, [displayedValue, fieldOptions, value])\n\n useEffect(() => {\n if (id || !query?.sort || value) {\n return\n }\n\n const option = fieldOptions.find((field) => field.value === query.sort)\n if (option) {\n setValue(option.value)\n setDisplayedValue(option)\n }\n }, [fieldOptions, id, query?.sort, value, setValue])\n\n const onChange = (option: { id: string; label: ReactNode; value: string } | null) => {\n if (!option) {\n setValue('')\n setDisplayedValue(null)\n } else {\n setValue(option.value)\n setDisplayedValue(option)\n }\n }\n\n return (\n <div className={baseClass} style={{ '--field-width': '33%' } as React.CSSProperties}>\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 isSortable={true}\n // @ts-expect-error react select option\n onChange={onChange}\n options={fieldOptions}\n // @ts-expect-error react select\n value={displayedValue}\n />\n </div>\n )\n}\n"],"names":["FieldLabel","ReactSelect","useConfig","useDocumentInfo","useField","useListQuery","React","useEffect","useState","reduceFields","useImportExport","baseClass","SortBy","props","id","setValue","value","collectionSlug","path","query","getEntityConfig","collection","displayedValue","setDisplayedValue","collectionConfig","fieldOptions","fields","option","find","field","sort","onChange","div","className","style","label","disabled","readOnly","getOptionValue","String","inputId","replace","isClearable","isSortable","options"],"mappings":"AAAA;;AAKA,SACEA,UAAU,EACVC,WAAW,EACXC,SAAS,EACTC,eAAe,EACfC,QAAQ,EACRC,YAAY,QACP,iBAAgB;AACvB,OAAOC,SAASC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAElD,SAASC,YAAY,QAAQ,oCAAmC;AAChE,SAASC,eAAe,QAAQ,mCAAkC;AAElE,MAAMC,YAAY;AAElB,OAAO,MAAMC,SAAqC,CAACC;IACjD,MAAM,EAAEC,EAAE,EAAE,GAAGX;IACf,MAAM,EAAEY,QAAQ,EAAEC,KAAK,EAAE,GAAGZ;IAC5B,MAAM,EAAEY,OAAOC,cAAc,EAAE,GAAGb,SAAiB;QAAEc,MAAM;IAAiB;IAC5E,MAAM,EAAEC,KAAK,EAAE,GAAGd;IAClB,MAAM,EAAEe,eAAe,EAAE,GAAGlB;IAC5B,MAAM,EAAEmB,UAAU,EAAE,GAAGX;IAEvB,MAAM,CAACY,gBAAgBC,kBAAkB,GAAGf,SAIlC;IAEV,MAAMgB,mBAAmBJ,gBAAgB;QAAEH,gBAAgBA,kBAAkBI;IAAW;IACxF,MAAMI,eAAehB,aAAa;QAAEiB,QAAQF,kBAAkBE;IAAO;IAErE,+CAA+C;IAC/CnB,UAAU;QACR,IAAI,CAACS,OAAO;YACVO,kBAAkB;YAClB;QACF;QAEA,MAAMI,SAASF,aAAaG,IAAI,CAAC,CAACC,QAAUA,MAAMb,KAAK,KAAKA;QAC5D,IAAIW,UAAW,CAAA,CAACL,kBAAkBA,eAAeN,KAAK,KAAKA,KAAI,GAAI;YACjEO,kBAAkBI;QACpB;IACF,GAAG;QAACL;QAAgBG;QAAcT;KAAM;IAExCT,UAAU;QACR,IAAIO,MAAM,CAACK,OAAOW,QAAQd,OAAO;YAC/B;QACF;QAEA,MAAMW,SAASF,aAAaG,IAAI,CAAC,CAACC,QAAUA,MAAMb,KAAK,KAAKG,MAAMW,IAAI;QACtE,IAAIH,QAAQ;YACVZ,SAASY,OAAOX,KAAK;YACrBO,kBAAkBI;QACpB;IACF,GAAG;QAACF;QAAcX;QAAIK,OAAOW;QAAMd;QAAOD;KAAS;IAEnD,MAAMgB,WAAW,CAACJ;QAChB,IAAI,CAACA,QAAQ;YACXZ,SAAS;YACTQ,kBAAkB;QACpB,OAAO;YACLR,SAASY,OAAOX,KAAK;YACrBO,kBAAkBI;QACpB;IACF;IAEA,qBACE,MAACK;QAAIC,WAAWtB;QAAWuB,OAAO;YAAE,iBAAiB;QAAM;;0BACzD,KAAClC;gBAAWmC,OAAOtB,MAAMgB,KAAK,CAACM,KAAK;gBAAEjB,MAAML,MAAMK,IAAI;;0BACtD,KAACjB;gBACCgC,WAAWtB;gBACXyB,UAAUvB,MAAMwB,QAAQ;gBACxBC,gBAAgB,CAACX,SAAWY,OAAOZ,OAAOX,KAAK;gBAC/CwB,SAAS,CAAC,MAAM,EAAE3B,MAAMK,IAAI,CAACuB,OAAO,CAAC,OAAO,OAAO;gBACnDC,aAAa;gBACbC,YAAY;gBACZ,uCAAuC;gBACvCZ,UAAUA;gBACVa,SAASnB;gBACT,gCAAgC;gBAChCT,OAAOM;;;;AAIf,EAAC"}
1
+ {"version":3,"sources":["../../../src/components/SortBy/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, useMemo, useRef, useState } from 'react'\n\nimport { applySortOrder, normalizeQueryParam, stripSortDash } from '../../utilities/sortHelpers.js'\nimport { reduceFields } from '../FieldsToExport/reduceFields.js'\nimport { useImportExport } from '../ImportExportProvider/index.js'\nimport './index.scss'\n\nconst baseClass = 'sort-by-fields'\n\nexport const SortBy: SelectFieldClientComponent = (props) => {\n const { id } = useDocumentInfo()\n\n // The \"sort\" text field that stores 'title' or '-title'\n const { setValue: setSort, value: sortRaw } = useField<string>()\n\n // Sibling order field ('asc' | 'desc') used when writing sort on change\n const { value: sortOrder = 'asc' } = useField<string>({ path: 'sortOrder' })\n // Needed so we can initialize sortOrder when SortOrder component is hidden\n const { setValue: setSortOrder } = useField<'asc' | 'desc'>({ path: 'sortOrder' })\n\n const { value: collectionSlug } = useField<string>({ path: 'collectionSlug' })\n const { query } = useListQuery()\n const { getEntityConfig } = useConfig()\n const { collection } = useImportExport()\n\n // ReactSelect's displayed option\n const [displayedValue, setDisplayedValue] = useState<{\n id: string\n label: ReactNode\n value: string\n } | null>(null)\n\n const collectionConfig = getEntityConfig({ collectionSlug: collectionSlug ?? collection })\n const fieldOptions = useMemo(\n () => reduceFields({ fields: collectionConfig?.fields }),\n [collectionConfig?.fields],\n )\n\n // Normalize the stored value for display (strip the '-') and pick the option\n useEffect(() => {\n const clean = stripSortDash(sortRaw)\n if (!clean) {\n setDisplayedValue(null)\n return\n }\n\n const option = fieldOptions.find((f) => f.value === clean)\n if (option && (!displayedValue || displayedValue.value !== clean)) {\n setDisplayedValue(option)\n }\n }, [sortRaw, fieldOptions, displayedValue])\n\n // One-time init guard so clearing `sort` doesn't rehydrate from query again\n const didInitRef = useRef(false)\n\n // Sync the visible select from list-view query sort (preferred) or groupBy (fallback)\n // and initialize both `sort` and `sortOrder` here as SortOrder may be hidden by admin.condition.\n useEffect(() => {\n if (didInitRef.current) {\n return\n }\n if (id) {\n didInitRef.current = true\n return\n }\n if (typeof sortRaw === 'string' && sortRaw.length > 0) {\n // Already initialized elsewhere\n didInitRef.current = true\n return\n }\n\n const qsSort = normalizeQueryParam(query?.sort)\n const qsGroupBy = normalizeQueryParam(query?.groupBy)\n\n const source = qsSort ?? qsGroupBy\n if (!source) {\n didInitRef.current = true\n return\n }\n\n const isDesc = !!qsSort && qsSort.startsWith('-')\n const base = stripSortDash(source)\n const order: 'asc' | 'desc' = isDesc ? 'desc' : 'asc'\n\n // Write BOTH fields so preview/export have the right values even if SortOrder is hidden\n setSort(applySortOrder(base, order))\n setSortOrder(order)\n\n const option = fieldOptions.find((f) => f.value === base)\n if (option) {\n setDisplayedValue(option)\n }\n\n didInitRef.current = true\n }, [id, query?.groupBy, query?.sort, sortRaw, fieldOptions, setSort, setSortOrder])\n\n // When user selects a different field, store it with the current order applied\n const onChange = (option: { id: string; label: ReactNode; value: string } | null) => {\n if (!option) {\n setSort('')\n setDisplayedValue(null)\n } else {\n setDisplayedValue(option)\n const next = applySortOrder(option.value, String(sortOrder) as 'asc' | 'desc')\n setSort(next)\n }\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 isSortable={true}\n // @ts-expect-error react select option\n onChange={onChange}\n options={fieldOptions}\n // @ts-expect-error react select\n value={displayedValue}\n />\n </div>\n )\n}\n"],"names":["FieldLabel","ReactSelect","useConfig","useDocumentInfo","useField","useListQuery","React","useEffect","useMemo","useRef","useState","applySortOrder","normalizeQueryParam","stripSortDash","reduceFields","useImportExport","baseClass","SortBy","props","id","setValue","setSort","value","sortRaw","sortOrder","path","setSortOrder","collectionSlug","query","getEntityConfig","collection","displayedValue","setDisplayedValue","collectionConfig","fieldOptions","fields","clean","option","find","f","didInitRef","current","length","qsSort","sort","qsGroupBy","groupBy","source","isDesc","startsWith","base","order","onChange","next","String","div","className","label","field","disabled","readOnly","getOptionValue","inputId","replace","isClearable","isSortable","options"],"mappings":"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"}
@@ -1,4 +1,3 @@
1
1
  .sort-by-fields {
2
- display: block;
3
- width: 33%;
2
+ --field-width: 25%;
4
3
  }
@@ -0,0 +1,4 @@
1
+ import type { SelectFieldClientComponent } from 'payload';
2
+ import './index.scss';
3
+ export declare const SortOrder: SelectFieldClientComponent;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/SortOrder/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAA;AAMzD,OAAO,cAAc,CAAA;AAcrB,eAAO,MAAM,SAAS,EAAE,0BAuGvB,CAAA"}
@@ -0,0 +1,123 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { FieldLabel, ReactSelect, useDocumentInfo, useField, useListQuery } from '@payloadcms/ui';
4
+ import React, { useEffect, useMemo, useRef, useState } from 'react';
5
+ import { applySortOrder, normalizeQueryParam, stripSortDash } from '../../utilities/sortHelpers.js';
6
+ import './index.scss';
7
+ const baseClass = 'sort-order-field';
8
+ const options = [
9
+ {
10
+ label: 'Ascending',
11
+ value: 'asc'
12
+ },
13
+ {
14
+ label: 'Descending',
15
+ value: 'desc'
16
+ }
17
+ ];
18
+ const defaultOption = options[0];
19
+ export const SortOrder = (props)=>{
20
+ const { id } = useDocumentInfo();
21
+ const { query } = useListQuery();
22
+ // 'sortOrder' select field: 'asc' | 'desc'
23
+ const { setValue: setOrder, value: orderValueRaw } = useField();
24
+ // 'sort' text field: 'title' | '-title'
25
+ const { setValue: setSort, value: sortRaw } = useField({
26
+ path: 'sort'
27
+ });
28
+ // The current order value, defaulting to 'asc' for UI
29
+ const orderValue = orderValueRaw || 'asc';
30
+ // Map 'asc' | 'desc' to the option object for ReactSelect
31
+ const currentOption = useMemo(()=>options.find((o)=>o.value === orderValue) ?? defaultOption, [
32
+ orderValue
33
+ ]);
34
+ const [displayed, setDisplayed] = useState(currentOption);
35
+ // One-time init guard so clearing `sort` doesn't rehydrate from query again
36
+ const didInitRef = useRef(false);
37
+ // Derive from list-view query.sort if present; otherwise fall back to groupBy
38
+ useEffect(()=>{
39
+ if (didInitRef.current) {
40
+ return;
41
+ }
42
+ // Existing export -> don't initialize here
43
+ if (id) {
44
+ didInitRef.current = true;
45
+ return;
46
+ }
47
+ // If sort already has a value, treat as initialized
48
+ if (typeof sortRaw === 'string' && sortRaw.length > 0) {
49
+ didInitRef.current = true;
50
+ return;
51
+ }
52
+ const qsSort = normalizeQueryParam(query?.sort);
53
+ const qsGroupBy = normalizeQueryParam(query?.groupBy);
54
+ if (qsSort) {
55
+ const isDesc = qsSort.startsWith('-');
56
+ const base = stripSortDash(qsSort);
57
+ const order = isDesc ? 'desc' : 'asc';
58
+ setOrder(order);
59
+ setSort(applySortOrder(base, order)) // combined: 'title' or '-title'
60
+ ;
61
+ didInitRef.current = true;
62
+ return;
63
+ }
64
+ // Fallback: groupBy (always ascending)
65
+ if (qsGroupBy) {
66
+ setOrder('asc');
67
+ setSort(applySortOrder(qsGroupBy, 'asc')) // write 'groupByField' (no dash)
68
+ ;
69
+ didInitRef.current = true;
70
+ return;
71
+ }
72
+ // Nothing to initialize
73
+ didInitRef.current = true;
74
+ }, [
75
+ id,
76
+ query?.sort,
77
+ query?.groupBy,
78
+ sortRaw,
79
+ setOrder,
80
+ setSort
81
+ ]);
82
+ // Keep the select's displayed option in sync with the stored order
83
+ useEffect(()=>{
84
+ setDisplayed(currentOption ?? defaultOption);
85
+ }, [
86
+ currentOption
87
+ ]);
88
+ // Handle manual order changes via ReactSelect:
89
+ // - update the order field
90
+ // - rewrite the combined "sort" string to add/remove the leading '-'
91
+ const onChange = (option)=>{
92
+ const next = option?.value ?? 'asc';
93
+ setOrder(next);
94
+ const base = stripSortDash(sortRaw);
95
+ if (base) {
96
+ setSort(applySortOrder(base, next));
97
+ }
98
+ setDisplayed(option ?? defaultOption);
99
+ };
100
+ return /*#__PURE__*/ _jsxs("div", {
101
+ className: baseClass,
102
+ children: [
103
+ /*#__PURE__*/ _jsx(FieldLabel, {
104
+ label: props.field.label,
105
+ path: props.path
106
+ }),
107
+ /*#__PURE__*/ _jsx(ReactSelect, {
108
+ className: baseClass,
109
+ disabled: props.readOnly,
110
+ inputId: `field-${props.path.replace(/\./g, '__')}`,
111
+ isClearable: false,
112
+ isSearchable: false,
113
+ // @ts-expect-error react-select option typing differs from our local type
114
+ onChange: onChange,
115
+ options: options,
116
+ // @ts-expect-error react-select option typing differs from our local type
117
+ value: displayed
118
+ })
119
+ ]
120
+ });
121
+ };
122
+
123
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/SortOrder/index.tsx"],"sourcesContent":["'use client'\n\nimport type { SelectFieldClientComponent } from 'payload'\n\nimport { FieldLabel, ReactSelect, useDocumentInfo, useField, useListQuery } from '@payloadcms/ui'\nimport React, { useEffect, useMemo, useRef, useState } from 'react'\n\nimport { applySortOrder, normalizeQueryParam, stripSortDash } from '../../utilities/sortHelpers.js'\nimport './index.scss'\n\nconst baseClass = 'sort-order-field'\n\ntype Order = 'asc' | 'desc'\ntype OrderOption = { label: string; value: Order }\n\nconst options = [\n { label: 'Ascending', value: 'asc' as const },\n { label: 'Descending', value: 'desc' as const },\n] as const\n\nconst defaultOption: OrderOption = options[0]\n\nexport const SortOrder: SelectFieldClientComponent = (props) => {\n const { id } = useDocumentInfo()\n const { query } = useListQuery()\n\n // 'sortOrder' select field: 'asc' | 'desc'\n const { setValue: setOrder, value: orderValueRaw } = useField<Order>()\n\n // 'sort' text field: 'title' | '-title'\n const { setValue: setSort, value: sortRaw } = useField<string>({ path: 'sort' })\n\n // The current order value, defaulting to 'asc' for UI\n const orderValue: Order = orderValueRaw || 'asc'\n\n // Map 'asc' | 'desc' to the option object for ReactSelect\n const currentOption = useMemo<OrderOption>(\n () => options.find((o) => o.value === orderValue) ?? defaultOption,\n [orderValue],\n )\n const [displayed, setDisplayed] = useState<null | OrderOption>(currentOption)\n\n // One-time init guard so clearing `sort` doesn't rehydrate from query again\n const didInitRef = useRef(false)\n\n // Derive from list-view query.sort if present; otherwise fall back to groupBy\n useEffect(() => {\n if (didInitRef.current) {\n return\n }\n\n // Existing export -> don't initialize here\n if (id) {\n didInitRef.current = true\n return\n }\n\n // If sort already has a value, treat as initialized\n if (typeof sortRaw === 'string' && sortRaw.length > 0) {\n didInitRef.current = true\n return\n }\n\n const qsSort = normalizeQueryParam(query?.sort)\n const qsGroupBy = normalizeQueryParam(query?.groupBy)\n\n if (qsSort) {\n const isDesc = qsSort.startsWith('-')\n const base = stripSortDash(qsSort)\n const order: Order = isDesc ? 'desc' : 'asc'\n setOrder(order)\n setSort(applySortOrder(base, order)) // combined: 'title' or '-title'\n didInitRef.current = true\n return\n }\n\n // Fallback: groupBy (always ascending)\n if (qsGroupBy) {\n setOrder('asc')\n setSort(applySortOrder(qsGroupBy, 'asc')) // write 'groupByField' (no dash)\n didInitRef.current = true\n return\n }\n\n // Nothing to initialize\n didInitRef.current = true\n }, [id, query?.sort, query?.groupBy, sortRaw, setOrder, setSort])\n\n // Keep the select's displayed option in sync with the stored order\n useEffect(() => {\n setDisplayed(currentOption ?? defaultOption)\n }, [currentOption])\n\n // Handle manual order changes via ReactSelect:\n // - update the order field\n // - rewrite the combined \"sort\" string to add/remove the leading '-'\n const onChange = (option: null | OrderOption) => {\n const next = option?.value ?? 'asc'\n setOrder(next)\n\n const base = stripSortDash(sortRaw)\n if (base) {\n setSort(applySortOrder(base, next))\n }\n\n setDisplayed(option ?? defaultOption)\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 inputId={`field-${props.path.replace(/\\./g, '__')}`}\n isClearable={false}\n isSearchable={false}\n // @ts-expect-error react-select option typing differs from our local type\n onChange={onChange}\n options={options as unknown as OrderOption[]}\n // @ts-expect-error react-select option typing differs from our local type\n value={displayed}\n />\n </div>\n )\n}\n"],"names":["FieldLabel","ReactSelect","useDocumentInfo","useField","useListQuery","React","useEffect","useMemo","useRef","useState","applySortOrder","normalizeQueryParam","stripSortDash","baseClass","options","label","value","defaultOption","SortOrder","props","id","query","setValue","setOrder","orderValueRaw","setSort","sortRaw","path","orderValue","currentOption","find","o","displayed","setDisplayed","didInitRef","current","length","qsSort","sort","qsGroupBy","groupBy","isDesc","startsWith","base","order","onChange","option","next","div","className","field","disabled","readOnly","inputId","replace","isClearable","isSearchable"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ .sort-order-field {
2
+ --field-width: 25%;
3
+ }
@@ -11,8 +11,10 @@ export type Export = {
11
11
  format: 'csv' | 'json';
12
12
  globals?: string[];
13
13
  id: number | string;
14
+ limit?: number;
14
15
  locale?: string;
15
16
  name: string;
17
+ page?: number;
16
18
  slug: string;
17
19
  sort: Sort;
18
20
  user: string;
@@ -1 +1 @@
1
- {"version":3,"file":"createExport.d.ts","sourceRoot":"","sources":["../../src/export/createExport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAYrE,MAAM,MAAM,MAAM,GAAG;IACnB,cAAc,EAAE,MAAM,CAAA;IACtB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,IAAI,GAAG,KAAK,CAAA;IACrB,iBAAiB,EAAE,MAAM,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,EAAE,KAAK,GAAG,MAAM,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,IAAI,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,EAAE,MAAM,CAAA;IACtB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,cAAc,CAAA;IACnB,IAAI,CAAC,EAAE,SAAS,CAAA;CACjB,CAAA;AAED,eAAO,MAAM,YAAY,SAAgB,gBAAgB,kCAkUxD,CAAA"}
1
+ {"version":3,"file":"createExport.d.ts","sourceRoot":"","sources":["../../src/export/createExport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAarE,MAAM,MAAM,MAAM,GAAG;IACnB,cAAc,EAAE,MAAM,CAAA;IACtB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,IAAI,GAAG,KAAK,CAAA;IACrB,iBAAiB,EAAE,MAAM,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,EAAE,KAAK,GAAG,MAAM,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,IAAI,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,EAAE,MAAM,CAAA;IACtB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,cAAc,CAAA;IACnB,IAAI,CAAC,EAAE,SAAS,CAAA;CACjB,CAAA;AAED,eAAO,MAAM,YAAY,SAAgB,gBAAgB,kCAyYxD,CAAA"}