@payloadcms/ui 3.24.0-canary.f229d8d → 3.24.0

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 (213) hide show
  1. package/dist/elements/Autosave/index.d.ts.map +1 -1
  2. package/dist/elements/Autosave/index.js +143 -108
  3. package/dist/elements/Autosave/index.js.map +1 -1
  4. package/dist/elements/BulkUpload/EditMany/DrawerContent.d.ts.map +1 -1
  5. package/dist/elements/BulkUpload/EditMany/DrawerContent.js +22 -20
  6. package/dist/elements/BulkUpload/EditMany/DrawerContent.js.map +1 -1
  7. package/dist/elements/Button/index.d.ts.map +1 -1
  8. package/dist/elements/Button/index.js +1 -0
  9. package/dist/elements/Button/index.js.map +1 -1
  10. package/dist/elements/Button/index.scss +21 -5
  11. package/dist/elements/ConfirmationModal/index.d.ts +16 -0
  12. package/dist/elements/ConfirmationModal/index.d.ts.map +1 -0
  13. package/dist/elements/ConfirmationModal/index.js +158 -0
  14. package/dist/elements/ConfirmationModal/index.js.map +1 -0
  15. package/dist/elements/{GenerateConfirmation → ConfirmationModal}/index.scss +1 -1
  16. package/dist/elements/DatePicker/DatePicker.d.ts.map +1 -1
  17. package/dist/elements/DatePicker/DatePicker.js +2 -0
  18. package/dist/elements/DatePicker/DatePicker.js.map +1 -1
  19. package/dist/elements/DatePicker/types.d.ts +1 -0
  20. package/dist/elements/DatePicker/types.d.ts.map +1 -1
  21. package/dist/elements/DatePicker/types.js.map +1 -1
  22. package/dist/elements/DeleteDocument/index.d.ts.map +1 -1
  23. package/dist/elements/DeleteDocument/index.js +31 -79
  24. package/dist/elements/DeleteDocument/index.js.map +1 -1
  25. package/dist/elements/DeleteDocument/index.scss +0 -29
  26. package/dist/elements/DeleteMany/index.d.ts.map +1 -1
  27. package/dist/elements/DeleteMany/index.js +16 -43
  28. package/dist/elements/DeleteMany/index.js.map +1 -1
  29. package/dist/elements/DeleteMany/index.scss +0 -29
  30. package/dist/elements/DocumentControls/index.d.ts.map +1 -1
  31. package/dist/elements/DocumentControls/index.js.map +1 -1
  32. package/dist/elements/DuplicateDocument/index.d.ts +0 -1
  33. package/dist/elements/DuplicateDocument/index.d.ts.map +1 -1
  34. package/dist/elements/DuplicateDocument/index.js +25 -54
  35. package/dist/elements/DuplicateDocument/index.js.map +1 -1
  36. package/dist/elements/EditMany/DrawerContent.d.ts.map +1 -1
  37. package/dist/elements/EditMany/DrawerContent.js +3 -2
  38. package/dist/elements/EditMany/DrawerContent.js.map +1 -1
  39. package/dist/elements/FileDetails/DraggableFileDetails/index.d.ts +1 -0
  40. package/dist/elements/FileDetails/DraggableFileDetails/index.d.ts.map +1 -1
  41. package/dist/elements/FileDetails/DraggableFileDetails/index.js +19 -17
  42. package/dist/elements/FileDetails/DraggableFileDetails/index.js.map +1 -1
  43. package/dist/elements/FileDetails/StaticFileDetails/index.d.ts +1 -0
  44. package/dist/elements/FileDetails/StaticFileDetails/index.d.ts.map +1 -1
  45. package/dist/elements/FileDetails/StaticFileDetails/index.js +2 -1
  46. package/dist/elements/FileDetails/StaticFileDetails/index.js.map +1 -1
  47. package/dist/elements/FileDetails/index.d.ts +1 -0
  48. package/dist/elements/FileDetails/index.d.ts.map +1 -1
  49. package/dist/elements/FileDetails/index.js.map +1 -1
  50. package/dist/elements/GenerateConfirmation/index.d.ts +1 -2
  51. package/dist/elements/GenerateConfirmation/index.d.ts.map +1 -1
  52. package/dist/elements/GenerateConfirmation/index.js +23 -47
  53. package/dist/elements/GenerateConfirmation/index.js.map +1 -1
  54. package/dist/elements/LeaveWithoutSaving/index.d.ts +0 -1
  55. package/dist/elements/LeaveWithoutSaving/index.d.ts.map +1 -1
  56. package/dist/elements/LeaveWithoutSaving/index.js +56 -113
  57. package/dist/elements/LeaveWithoutSaving/index.js.map +1 -1
  58. package/dist/elements/ListControls/index.d.ts +1 -0
  59. package/dist/elements/ListControls/index.d.ts.map +1 -1
  60. package/dist/elements/ListControls/index.js +14 -0
  61. package/dist/elements/ListControls/index.js.map +1 -1
  62. package/dist/elements/ListControls/index.scss +5 -0
  63. package/dist/elements/Localizer/LocalizerLabel/index.d.ts.map +1 -1
  64. package/dist/elements/Localizer/LocalizerLabel/index.js +11 -8
  65. package/dist/elements/Localizer/LocalizerLabel/index.js.map +1 -1
  66. package/dist/elements/Localizer/index.d.ts.map +1 -1
  67. package/dist/elements/Localizer/index.js +2 -0
  68. package/dist/elements/Localizer/index.js.map +1 -1
  69. package/dist/elements/Popup/index.d.ts +1 -0
  70. package/dist/elements/Popup/index.d.ts.map +1 -1
  71. package/dist/elements/Popup/index.js +2 -0
  72. package/dist/elements/Popup/index.js.map +1 -1
  73. package/dist/elements/PreviewButton/index.d.ts +2 -1
  74. package/dist/elements/PreviewButton/index.d.ts.map +1 -1
  75. package/dist/elements/PreviewButton/index.js +2 -2
  76. package/dist/elements/PreviewButton/index.js.map +1 -1
  77. package/dist/elements/PublishButton/ScheduleDrawer/buildUpcomingColumns.d.ts +1 -2
  78. package/dist/elements/PublishButton/ScheduleDrawer/buildUpcomingColumns.d.ts.map +1 -1
  79. package/dist/elements/PublishButton/ScheduleDrawer/buildUpcomingColumns.js.map +1 -1
  80. package/dist/elements/PublishButton/ScheduleDrawer/index.d.ts +2 -0
  81. package/dist/elements/PublishButton/ScheduleDrawer/index.d.ts.map +1 -1
  82. package/dist/elements/PublishButton/ScheduleDrawer/index.js +6 -2
  83. package/dist/elements/PublishButton/ScheduleDrawer/index.js.map +1 -1
  84. package/dist/elements/PublishButton/index.d.ts +2 -3
  85. package/dist/elements/PublishButton/index.d.ts.map +1 -1
  86. package/dist/elements/PublishButton/index.js +20 -17
  87. package/dist/elements/PublishButton/index.js.map +1 -1
  88. package/dist/elements/PublishMany/index.d.ts +0 -1
  89. package/dist/elements/PublishMany/index.d.ts.map +1 -1
  90. package/dist/elements/PublishMany/index.js +19 -45
  91. package/dist/elements/PublishMany/index.js.map +1 -1
  92. package/dist/elements/RelationshipTable/index.d.ts +7 -2
  93. package/dist/elements/RelationshipTable/index.d.ts.map +1 -1
  94. package/dist/elements/RelationshipTable/index.js +69 -23
  95. package/dist/elements/RelationshipTable/index.js.map +1 -1
  96. package/dist/elements/RelationshipTable/index.scss +6 -0
  97. package/dist/elements/SaveButton/index.d.ts +2 -3
  98. package/dist/elements/SaveButton/index.d.ts.map +1 -1
  99. package/dist/elements/SaveButton/index.js +3 -3
  100. package/dist/elements/SaveButton/index.js.map +1 -1
  101. package/dist/elements/SaveDraftButton/index.d.ts +2 -1
  102. package/dist/elements/SaveDraftButton/index.d.ts.map +1 -1
  103. package/dist/elements/SaveDraftButton/index.js +2 -2
  104. package/dist/elements/SaveDraftButton/index.js.map +1 -1
  105. package/dist/elements/Status/index.d.ts.map +1 -1
  106. package/dist/elements/Status/index.js +173 -154
  107. package/dist/elements/Status/index.js.map +1 -1
  108. package/dist/elements/Status/index.scss +0 -41
  109. package/dist/elements/StayLoggedIn/index.d.ts +0 -1
  110. package/dist/elements/StayLoggedIn/index.d.ts.map +1 -1
  111. package/dist/elements/StayLoggedIn/index.js +45 -77
  112. package/dist/elements/StayLoggedIn/index.js.map +1 -1
  113. package/dist/elements/Table/index.d.ts +1 -9
  114. package/dist/elements/Table/index.d.ts.map +1 -1
  115. package/dist/elements/Table/index.js.map +1 -1
  116. package/dist/elements/TableColumns/buildColumnState.d.ts +1 -2
  117. package/dist/elements/TableColumns/buildColumnState.d.ts.map +1 -1
  118. package/dist/elements/TableColumns/buildColumnState.js.map +1 -1
  119. package/dist/elements/TableColumns/buildPolymorphicColumnState.d.ts +20 -0
  120. package/dist/elements/TableColumns/buildPolymorphicColumnState.d.ts.map +1 -0
  121. package/dist/elements/TableColumns/buildPolymorphicColumnState.js +200 -0
  122. package/dist/elements/TableColumns/buildPolymorphicColumnState.js.map +1 -0
  123. package/dist/elements/TableColumns/index.d.ts +2 -3
  124. package/dist/elements/TableColumns/index.d.ts.map +1 -1
  125. package/dist/elements/TableColumns/index.js +4 -3
  126. package/dist/elements/TableColumns/index.js.map +1 -1
  127. package/dist/elements/UnpublishMany/index.d.ts +1 -2
  128. package/dist/elements/UnpublishMany/index.d.ts.map +1 -1
  129. package/dist/elements/UnpublishMany/index.js +14 -42
  130. package/dist/elements/UnpublishMany/index.js.map +1 -1
  131. package/dist/elements/Upload/index.d.ts.map +1 -1
  132. package/dist/elements/Upload/index.js +5 -1
  133. package/dist/elements/Upload/index.js.map +1 -1
  134. package/dist/elements/ViewDescription/index.d.ts +2 -5
  135. package/dist/elements/ViewDescription/index.d.ts.map +1 -1
  136. package/dist/elements/ViewDescription/index.js +2 -2
  137. package/dist/elements/ViewDescription/index.js.map +1 -1
  138. package/dist/exports/client/CodeEditor-L6GW2VQ6.js.map +0 -1
  139. package/dist/exports/client/{DatePicker-THCU4KZJ.js → DatePicker-HHQ6TPOW.js} +2 -2
  140. package/dist/exports/client/{DatePicker-THCU4KZJ.js.map → DatePicker-HHQ6TPOW.js.map} +0 -1
  141. package/dist/exports/client/chunk-5LKBKI4T.js.map +0 -1
  142. package/dist/exports/client/{chunk-EG3ZOHFS.js → chunk-IMEQ6NKQ.js} +2 -2
  143. package/dist/exports/client/{chunk-EG3ZOHFS.js.map → chunk-IMEQ6NKQ.js.map} +3 -4
  144. package/dist/exports/client/chunk-ZZDNSFEW.js.map +0 -1
  145. package/dist/exports/client/index.d.ts +46 -4
  146. package/dist/exports/client/index.d.ts.map +1 -1
  147. package/dist/exports/client/index.js +23 -23
  148. package/dist/exports/client/index.js.map +4 -5
  149. package/dist/fields/DateTime/index.d.ts.map +1 -1
  150. package/dist/fields/DateTime/index.js +24 -6
  151. package/dist/fields/DateTime/index.js.map +1 -1
  152. package/dist/fields/Join/index.d.ts.map +1 -1
  153. package/dist/fields/Join/index.js +8 -3
  154. package/dist/fields/Join/index.js.map +1 -1
  155. package/dist/fields/Select/Input.d.ts.map +1 -1
  156. package/dist/fields/Select/Input.js +2 -0
  157. package/dist/fields/Select/Input.js.map +1 -1
  158. package/dist/fields/Tabs/Tab/index.scss +2 -1
  159. package/dist/fields/Upload/Input.d.ts +1 -0
  160. package/dist/fields/Upload/Input.d.ts.map +1 -1
  161. package/dist/fields/Upload/Input.js.map +1 -1
  162. package/dist/forms/Form/index.d.ts.map +1 -1
  163. package/dist/forms/Form/index.js +19 -8
  164. package/dist/forms/Form/index.js.map +1 -1
  165. package/dist/forms/Form/initContextState.d.ts.map +1 -1
  166. package/dist/forms/Form/initContextState.js +2 -0
  167. package/dist/forms/Form/initContextState.js.map +1 -1
  168. package/dist/forms/Form/types.d.ts +6 -0
  169. package/dist/forms/Form/types.d.ts.map +1 -1
  170. package/dist/forms/Form/types.js.map +1 -1
  171. package/dist/icons/Dots/index.d.ts +7 -0
  172. package/dist/icons/Dots/index.d.ts.map +1 -0
  173. package/dist/icons/Dots/index.js +12 -0
  174. package/dist/icons/Dots/index.js.map +1 -0
  175. package/dist/icons/Dots/index.scss +27 -0
  176. package/dist/providers/Selection/index.d.ts.map +1 -1
  177. package/dist/providers/Selection/index.js +5 -6
  178. package/dist/providers/Selection/index.js.map +1 -1
  179. package/dist/styles.css +1 -1
  180. package/dist/utilities/buildTableState.d.ts +1 -2
  181. package/dist/utilities/buildTableState.d.ts.map +1 -1
  182. package/dist/utilities/buildTableState.js +72 -20
  183. package/dist/utilities/buildTableState.js.map +1 -1
  184. package/dist/utilities/copyDataFromLocale.d.ts.map +1 -1
  185. package/dist/utilities/copyDataFromLocale.js +20 -14
  186. package/dist/utilities/copyDataFromLocale.js.map +1 -1
  187. package/dist/utilities/handleFormStateLocking.d.ts.map +1 -1
  188. package/dist/utilities/handleFormStateLocking.js +3 -6
  189. package/dist/utilities/handleFormStateLocking.js.map +1 -1
  190. package/dist/utilities/renderTable.d.ts +6 -4
  191. package/dist/utilities/renderTable.d.ts.map +1 -1
  192. package/dist/utilities/renderTable.js +49 -17
  193. package/dist/utilities/renderTable.js.map +1 -1
  194. package/dist/views/Edit/Auth/index.d.ts.map +1 -1
  195. package/dist/views/Edit/Auth/index.js +56 -55
  196. package/dist/views/Edit/Auth/index.js.map +1 -1
  197. package/dist/views/Edit/index.d.ts +2 -2
  198. package/dist/views/Edit/index.d.ts.map +1 -1
  199. package/dist/views/Edit/index.js +3 -3
  200. package/dist/views/Edit/index.js.map +1 -1
  201. package/dist/views/List/index.d.ts +2 -25
  202. package/dist/views/List/index.d.ts.map +1 -1
  203. package/dist/views/List/index.js +6 -3
  204. package/dist/views/List/index.js.map +1 -1
  205. package/dist/views/List/types.d.ts +1 -18
  206. package/dist/views/List/types.d.ts.map +1 -1
  207. package/dist/views/List/types.js.map +1 -1
  208. package/package.json +4 -4
  209. package/dist/elements/DuplicateDocument/index.scss +0 -42
  210. package/dist/elements/LeaveWithoutSaving/index.scss +0 -39
  211. package/dist/elements/PublishMany/index.scss +0 -39
  212. package/dist/elements/StayLoggedIn/index.scss +0 -40
  213. package/dist/elements/UnpublishMany/index.scss +0 -39
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/Autosave/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAGzE,OAAO,KAAsC,MAAM,OAAO,CAAA;AAgB1D,OAAO,cAAc,CAAA;AAQrB,MAAM,MAAM,KAAK,GAAG;IAClB,UAAU,CAAC,EAAE,sBAAsB,CAAA;IACnC,MAAM,CAAC,EAAE,kBAAkB,CAAA;IAC3B,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACpB,qBAAqB,EAAE,MAAM,CAAA;CAC9B,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAkQpC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/Autosave/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAIzE,OAAO,KAAwD,MAAM,OAAO,CAAA;AAe5E,OAAO,cAAc,CAAA;AAUrB,MAAM,MAAM,KAAK,GAAG;IAClB,UAAU,CAAC,EAAE,sBAAsB,CAAA;IACnC,MAAM,CAAC,EAAE,kBAAkB,CAAA;IAC3B,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACpB,qBAAqB,EAAE,MAAM,CAAA;CAC9B,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAqTpC,CAAA"}
@@ -1,8 +1,9 @@
1
1
  'use client';
2
2
 
3
3
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
- import { versionDefaults } from 'payload/shared';
5
- import React, { useEffect, useRef, useState } from 'react';
4
+ import { dequal } from 'dequal/lite';
5
+ import { reduceFieldsToValues, versionDefaults } from 'payload/shared';
6
+ import React, { useDeferredValue, useEffect, useRef, useState } from 'react';
6
7
  import { toast } from 'sonner';
7
8
  import { useAllFormFields, useForm, useFormModified, useFormSubmitted } from '../../forms/Form/context.js';
8
9
  import { useDebounce } from '../../hooks/useDebounce.js';
@@ -11,10 +12,11 @@ import { useConfig } from '../../providers/Config/index.js';
11
12
  import { useDocumentEvents } from '../../providers/DocumentEvents/index.js';
12
13
  import { useDocumentInfo } from '../../providers/DocumentInfo/index.js';
13
14
  import { useLocale } from '../../providers/Locale/index.js';
14
- import { useTranslation } from '../../providers/Translation/index.js';
15
15
  import './index.scss';
16
+ import { useTranslation } from '../../providers/Translation/index.js';
16
17
  import { formatTimeToNow } from '../../utilities/formatDate.js';
17
18
  import { reduceFieldsToValuesWithValidation } from '../../utilities/reduceFieldsToValuesWithValidation.js';
19
+ import { LeaveWithoutSaving } from '../LeaveWithoutSaving/index.js';
18
20
  const baseClass = 'autosave';
19
21
  // The minimum time the saving state should be shown
20
22
  const minimumAnimationTime = 1000;
@@ -48,12 +50,13 @@ export const Autosave = ({
48
50
  } = useDocumentEvents();
49
51
  const {
50
52
  dispatchFields,
53
+ isValid,
54
+ setIsValid,
51
55
  setSubmitted
52
56
  } = useForm();
53
- const submitted = useFormSubmitted();
54
- const versionsConfig = docConfig?.versions;
55
57
  const [fields] = useAllFormFields();
56
58
  const modified = useFormModified();
59
+ const submitted = useFormSubmitted();
57
60
  const {
58
61
  code: locale
59
62
  } = useLocale();
@@ -61,17 +64,23 @@ export const Autosave = ({
61
64
  i18n,
62
65
  t
63
66
  } = useTranslation();
67
+ const versionsConfig = docConfig?.versions;
64
68
  let interval = versionDefaults.autosaveInterval;
65
69
  if (versionsConfig.drafts && versionsConfig.drafts.autosave) {
66
70
  interval = versionsConfig.drafts.autosave.interval;
67
71
  }
68
- const [saving, setSaving] = useState(false);
72
+ const validateOnDraft = Boolean(docConfig?.versions?.drafts && docConfig?.versions?.drafts.validate);
73
+ const [_saving, setSaving] = useState(false);
74
+ const saving = useDeferredValue(_saving);
69
75
  const debouncedFields = useDebounce(fields, interval);
70
76
  const fieldRef = useRef(fields);
71
77
  const modifiedRef = useRef(modified);
72
78
  const localeRef = useRef(locale);
73
- const debouncedRef = useRef(debouncedFields);
74
- debouncedRef.current = debouncedFields;
79
+ /**
80
+ * Track the validation internally so Autosave can determine when to run queue processing again
81
+ * Helps us prevent infinite loops when the queue is processing and the form is invalid
82
+ */
83
+ const isValidRef = useRef(isValid);
75
84
  // Store fields in ref so the autosave func
76
85
  // can always retrieve the most to date copies
77
86
  // after the timeout has executed
@@ -87,6 +96,13 @@ export const Autosave = ({
87
96
  if (isProcessingRef.current || queueRef.current.length === 0) {
88
97
  return;
89
98
  }
99
+ if (!isValidRef.current) {
100
+ // Clear queue so we don't end up in an infinite loop
101
+ queueRef.current = [];
102
+ // Reset internal validation state so queue processing can run again
103
+ isValidRef.current = true;
104
+ return;
105
+ }
90
106
  isProcessingRef.current = true;
91
107
  const latestAction = queueRef.current[queueRef.current.length - 1];
92
108
  queueRef.current = [];
@@ -99,12 +115,22 @@ export const Autosave = ({
99
115
  }
100
116
  }
101
117
  }, []);
118
+ const autosaveTimeoutRef = useRef(null);
102
119
  const handleAutosave = useEffectEvent(() => {
103
- const abortController = new AbortController();
104
- let autosaveTimeout = undefined;
120
+ autosaveTimeoutRef.current = undefined;
105
121
  // We need to log the time in order to figure out if we need to trigger the state off later
106
122
  let startTimestamp = undefined;
107
123
  let endTimestamp = undefined;
124
+ const hideIndicator = () => {
125
+ // If request was faster than minimum animation time, animate the difference
126
+ if (endTimestamp - startTimestamp < minimumAnimationTime) {
127
+ autosaveTimeoutRef.current = setTimeout(() => {
128
+ setSaving(false);
129
+ }, minimumAnimationTime - (endTimestamp - startTimestamp));
130
+ } else {
131
+ stopAutoSaveIndicator();
132
+ }
133
+ };
108
134
  const autosave = async () => {
109
135
  if (modified) {
110
136
  startTimestamp = new Date().getTime();
@@ -127,88 +153,86 @@ export const Autosave = ({
127
153
  const {
128
154
  data,
129
155
  valid
130
- } = {
131
- ...reduceFieldsToValuesWithValidation(fieldRef.current, true)
132
- };
156
+ } = reduceFieldsToValuesWithValidation(fieldRef.current, true);
133
157
  data._status = 'draft';
134
158
  const skipSubmission = submitted && !valid && versionsConfig?.drafts && versionsConfig?.drafts?.validate;
135
- if (!skipSubmission) {
136
- await fetch(url, {
137
- body: JSON.stringify(data),
138
- credentials: 'include',
139
- headers: {
140
- 'Accept-Language': i18n.language,
141
- 'Content-Type': 'application/json'
142
- },
143
- method,
144
- signal: abortController.signal
145
- }).then(res => {
146
- const newDate = new Date();
147
- // We need to log the time in order to figure out if we need to trigger the state off later
148
- endTimestamp = newDate.getTime();
149
- if (res.status === 200) {
150
- setLastUpdateTime(newDate.getTime());
151
- reportUpdate({
152
- id,
153
- entitySlug,
154
- updatedAt: newDate.toISOString()
155
- });
156
- if (!mostRecentVersionIsAutosaved) {
157
- incrementVersionCount();
158
- setMostRecentVersionIsAutosaved(true);
159
- setUnpublishedVersionCount(prev => prev + 1);
160
- }
159
+ if (!skipSubmission && isValidRef.current) {
160
+ let res;
161
+ try {
162
+ res = await fetch(url, {
163
+ body: JSON.stringify(data),
164
+ credentials: 'include',
165
+ headers: {
166
+ 'Accept-Language': i18n.language,
167
+ 'Content-Type': 'application/json'
168
+ },
169
+ method
170
+ });
171
+ } catch (error) {
172
+ // Swallow Error
173
+ }
174
+ const newDate = new Date();
175
+ // We need to log the time in order to figure out if we need to trigger the state off later
176
+ endTimestamp = newDate.getTime();
177
+ if (res.status === 200) {
178
+ setLastUpdateTime(newDate.getTime());
179
+ reportUpdate({
180
+ id,
181
+ entitySlug,
182
+ updatedAt: newDate.toISOString()
183
+ });
184
+ if (!mostRecentVersionIsAutosaved) {
185
+ incrementVersionCount();
186
+ setMostRecentVersionIsAutosaved(true);
187
+ setUnpublishedVersionCount(prev => prev + 1);
161
188
  }
162
- return res.json();
163
- }).then(json => {
164
- if (versionsConfig?.drafts && versionsConfig?.drafts?.validate && json?.errors) {
165
- if (Array.isArray(json.errors)) {
166
- const [fieldErrors, nonFieldErrors] = json.errors.reduce(([fieldErrs, nonFieldErrs], err) => {
167
- const newFieldErrs = [];
168
- const newNonFieldErrs = [];
169
- if (err?.message) {
170
- newNonFieldErrs.push(err);
171
- }
172
- if (Array.isArray(err?.data)) {
173
- err.data.forEach(dataError => {
174
- if (dataError?.field) {
175
- newFieldErrs.push(dataError);
176
- } else {
177
- newNonFieldErrs.push(dataError);
178
- }
179
- });
180
- }
181
- return [[...fieldErrs, ...newFieldErrs], [...nonFieldErrs, ...newNonFieldErrs]];
182
- }, [[], []]);
183
- dispatchFields({
184
- type: 'ADD_SERVER_ERRORS',
185
- errors: fieldErrors
186
- });
187
- nonFieldErrors.forEach(err_0 => {
188
- toast.error(err_0.message || i18n.t('error:unknown'));
189
- });
190
- setSubmitted(true);
191
- setSaving(false);
192
- return;
193
- }
194
- } else {
195
- // If it's not an error then we can update the document data inside the context
196
- const document = json?.doc || json?.result;
197
- // Manually update the data since this function doesn't fire the `submit` function from useForm
198
- if (document) {
199
- updateSavedDocumentData(document);
200
- }
189
+ }
190
+ const json = await res.json();
191
+ if (versionsConfig?.drafts && versionsConfig?.drafts?.validate && json?.errors) {
192
+ if (Array.isArray(json.errors)) {
193
+ const [fieldErrors, nonFieldErrors] = json.errors.reduce(([fieldErrs, nonFieldErrs], err) => {
194
+ const newFieldErrs = [];
195
+ const newNonFieldErrs = [];
196
+ if (err?.message) {
197
+ newNonFieldErrs.push(err);
198
+ }
199
+ if (Array.isArray(err?.data)) {
200
+ err.data.forEach(dataError => {
201
+ if (dataError?.field) {
202
+ newFieldErrs.push(dataError);
203
+ } else {
204
+ newNonFieldErrs.push(dataError);
205
+ }
206
+ });
207
+ }
208
+ return [[...fieldErrs, ...newFieldErrs], [...nonFieldErrs, ...newNonFieldErrs]];
209
+ }, [[], []]);
210
+ dispatchFields({
211
+ type: 'ADD_SERVER_ERRORS',
212
+ errors: fieldErrors
213
+ });
214
+ nonFieldErrors.forEach(err_0 => {
215
+ toast.error(err_0.message || i18n.t('error:unknown'));
216
+ });
217
+ // Set valid to false internally so the queue doesn't process
218
+ isValidRef.current = false;
219
+ setIsValid(false);
220
+ setSubmitted(true);
221
+ hideIndicator();
222
+ return;
201
223
  }
202
- }).then(() => {
203
- // If request was faster than minimum animation time, animate the difference
204
- if (endTimestamp - startTimestamp < minimumAnimationTime) {
205
- autosaveTimeout = setTimeout(() => {
206
- setSaving(false);
207
- }, minimumAnimationTime - (endTimestamp - startTimestamp));
208
- } else {
209
- setSaving(false);
224
+ } else {
225
+ // If it's not an error then we can update the document data inside the context
226
+ const document = json?.doc || json?.result;
227
+ // Manually update the data since this function doesn't fire the `submit` function from useForm
228
+ if (document) {
229
+ setIsValid(true);
230
+ // Reset internal state allowing the queue to process
231
+ isValidRef.current = true;
232
+ updateSavedDocumentData(document);
210
233
  }
211
- });
234
+ }
235
+ hideIndicator();
212
236
  }
213
237
  }
214
238
  }
@@ -216,34 +240,45 @@ export const Autosave = ({
216
240
  };
217
241
  queueRef.current.push(autosave);
218
242
  void processQueue();
219
- return {
220
- abortController,
221
- autosaveTimeout
222
- };
223
243
  });
244
+ const didMount = useRef(false);
245
+ const previousDebouncedFieldValues = useRef(reduceFieldsToValues(debouncedFields));
224
246
  // When debounced fields change, autosave
225
247
  useEffect(() => {
226
- const {
227
- abortController: abortController_0,
228
- autosaveTimeout: autosaveTimeout_0
229
- } = handleAutosave();
248
+ /**
249
+ * Ensure autosave doesn't run on mount
250
+ */
251
+ if (!didMount.current) {
252
+ didMount.current = true;
253
+ return;
254
+ }
255
+ /**
256
+ * Ensure autosave only runs if the form data changes, not every time the entire form state changes
257
+ */
258
+ const debouncedFieldValues = reduceFieldsToValues(debouncedFields);
259
+ if (dequal(debouncedFieldValues, previousDebouncedFieldValues)) {
260
+ return;
261
+ }
262
+ previousDebouncedFieldValues.current = debouncedFieldValues;
263
+ handleAutosave();
264
+ }, [debouncedFields]);
265
+ /**
266
+ * If component unmounts, clear the autosave timeout
267
+ */
268
+ useEffect(() => {
230
269
  return () => {
231
- if (autosaveTimeout_0) {
232
- clearTimeout(autosaveTimeout_0);
233
- }
234
- if (abortController_0.signal) {
235
- try {
236
- abortController_0.abort('Autosave closed early.');
237
- } catch (error) {
238
- // swallow error
239
- }
240
- }
241
- setSaving(false);
270
+ stopAutoSaveIndicator();
242
271
  };
243
- }, [debouncedFields]);
272
+ }, []);
273
+ const stopAutoSaveIndicator = useEffectEvent(() => {
274
+ if (autosaveTimeoutRef.current) {
275
+ clearTimeout(autosaveTimeoutRef.current);
276
+ }
277
+ setSaving(false);
278
+ });
244
279
  return /*#__PURE__*/_jsxs("div", {
245
280
  className: baseClass,
246
- children: [saving && t('general:saving'), !saving && Boolean(lastUpdateTime) && /*#__PURE__*/_jsx(React.Fragment, {
281
+ children: [validateOnDraft && !isValid && /*#__PURE__*/_jsx(LeaveWithoutSaving, {}), saving && t('general:saving'), !saving && Boolean(lastUpdateTime) && /*#__PURE__*/_jsx(React.Fragment, {
247
282
  children: t('version:lastSavedAgo', {
248
283
  distance: formatTimeToNow({
249
284
  date: lastUpdateTime,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["versionDefaults","React","useEffect","useRef","useState","toast","useAllFormFields","useForm","useFormModified","useFormSubmitted","useDebounce","useEffectEvent","useConfig","useDocumentEvents","useDocumentInfo","useLocale","useTranslation","formatTimeToNow","reduceFieldsToValuesWithValidation","baseClass","minimumAnimationTime","Autosave","id","collection","global","globalDoc","config","routes","api","serverURL","docConfig","incrementVersionCount","lastUpdateTime","mostRecentVersionIsAutosaved","setLastUpdateTime","setMostRecentVersionIsAutosaved","setUnpublishedVersionCount","updateSavedDocumentData","queueRef","isProcessingRef","reportUpdate","dispatchFields","setSubmitted","submitted","versionsConfig","versions","fields","modified","code","locale","i18n","t","interval","autosaveInterval","drafts","autosave","saving","setSaving","debouncedFields","fieldRef","modifiedRef","localeRef","debouncedRef","current","processQueue","useCallback","length","latestAction","handleAutosave","abortController","AbortController","autosaveTimeout","undefined","startTimestamp","endTimestamp","Date","getTime","url","method","entitySlug","slug","data","valid","_status","skipSubmission","validate","fetch","body","JSON","stringify","credentials","headers","language","signal","then","res","newDate","status","updatedAt","toISOString","prev","json","errors","Array","isArray","fieldErrors","nonFieldErrors","reduce","fieldErrs","nonFieldErrs","err","newFieldErrs","newNonFieldErrs","message","push","forEach","dataError","field","type","error","document","doc","result","setTimeout","clearTimeout","abort","_jsxs","className","Boolean","_jsx","Fragment","distance","date"],"sources":["../../../src/elements/Autosave/index.tsx"],"sourcesContent":["'use client'\n// TODO: abstract the `next/navigation` dependency out from this component\nimport type { ClientCollectionConfig, ClientGlobalConfig } from 'payload'\n\nimport { versionDefaults } from 'payload/shared'\nimport React, { useEffect, useRef, useState } from 'react'\nimport { toast } from 'sonner'\n\nimport {\n useAllFormFields,\n useForm,\n useFormModified,\n useFormSubmitted,\n} from '../../forms/Form/context.js'\nimport { useDebounce } from '../../hooks/useDebounce.js'\nimport { useEffectEvent } from '../../hooks/useEffectEvent.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useDocumentEvents } from '../../providers/DocumentEvents/index.js'\nimport { useDocumentInfo } from '../../providers/DocumentInfo/index.js'\nimport { useLocale } from '../../providers/Locale/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport './index.scss'\nimport { formatTimeToNow } from '../../utilities/formatDate.js'\nimport { reduceFieldsToValuesWithValidation } from '../../utilities/reduceFieldsToValuesWithValidation.js'\n\nconst baseClass = 'autosave'\n// The minimum time the saving state should be shown\nconst minimumAnimationTime = 1000\n\nexport type Props = {\n collection?: ClientCollectionConfig\n global?: ClientGlobalConfig\n id?: number | string\n publishedDocUpdatedAt: string\n}\n\nexport const Autosave: React.FC<Props> = ({ id, collection, global: globalDoc }) => {\n const {\n config: {\n routes: { api },\n serverURL,\n },\n } = useConfig()\n const {\n docConfig,\n incrementVersionCount,\n lastUpdateTime,\n mostRecentVersionIsAutosaved,\n setLastUpdateTime,\n setMostRecentVersionIsAutosaved,\n setUnpublishedVersionCount,\n updateSavedDocumentData,\n } = useDocumentInfo()\n const queueRef = useRef([])\n const isProcessingRef = useRef(false)\n\n const { reportUpdate } = useDocumentEvents()\n const { dispatchFields, setSubmitted } = useForm()\n const submitted = useFormSubmitted()\n const versionsConfig = docConfig?.versions\n\n const [fields] = useAllFormFields()\n const modified = useFormModified()\n const { code: locale } = useLocale()\n const { i18n, t } = useTranslation()\n\n let interval = versionDefaults.autosaveInterval\n if (versionsConfig.drafts && versionsConfig.drafts.autosave) {\n interval = versionsConfig.drafts.autosave.interval\n }\n\n const [saving, setSaving] = useState(false)\n const debouncedFields = useDebounce(fields, interval)\n const fieldRef = useRef(fields)\n const modifiedRef = useRef(modified)\n const localeRef = useRef(locale)\n const debouncedRef = useRef(debouncedFields)\n\n debouncedRef.current = debouncedFields\n\n // Store fields in ref so the autosave func\n // can always retrieve the most to date copies\n // after the timeout has executed\n fieldRef.current = fields\n\n // Store modified in ref so the autosave func\n // can bail out if modified becomes false while\n // timing out during autosave\n modifiedRef.current = modified\n\n // Store locale in ref so the autosave func\n // can always retrieve the most to date locale\n localeRef.current = locale\n\n const processQueue = React.useCallback(async () => {\n if (isProcessingRef.current || queueRef.current.length === 0) {\n return\n }\n\n isProcessingRef.current = true\n const latestAction = queueRef.current[queueRef.current.length - 1]\n queueRef.current = []\n\n try {\n await latestAction()\n } finally {\n isProcessingRef.current = false\n if (queueRef.current.length > 0) {\n await processQueue()\n }\n }\n }, [])\n\n const handleAutosave = useEffectEvent(() => {\n const abortController = new AbortController()\n let autosaveTimeout = undefined\n // We need to log the time in order to figure out if we need to trigger the state off later\n let startTimestamp = undefined\n let endTimestamp = undefined\n\n const autosave = async () => {\n if (modified) {\n startTimestamp = new Date().getTime()\n\n setSaving(true)\n\n let url: string\n let method: string\n let entitySlug: string\n\n if (collection && id) {\n entitySlug = collection.slug\n url = `${serverURL}${api}/${entitySlug}/${id}?draft=true&autosave=true&locale=${localeRef.current}`\n method = 'PATCH'\n }\n\n if (globalDoc) {\n entitySlug = globalDoc.slug\n url = `${serverURL}${api}/globals/${entitySlug}?draft=true&autosave=true&locale=${localeRef.current}`\n method = 'POST'\n }\n\n if (url) {\n if (modifiedRef.current) {\n const { data, valid } = {\n ...reduceFieldsToValuesWithValidation(fieldRef.current, true),\n }\n data._status = 'draft'\n const skipSubmission =\n submitted && !valid && versionsConfig?.drafts && versionsConfig?.drafts?.validate\n\n if (!skipSubmission) {\n await fetch(url, {\n body: JSON.stringify(data),\n credentials: 'include',\n headers: {\n 'Accept-Language': i18n.language,\n 'Content-Type': 'application/json',\n },\n method,\n signal: abortController.signal,\n })\n .then((res) => {\n const newDate = new Date()\n // We need to log the time in order to figure out if we need to trigger the state off later\n endTimestamp = newDate.getTime()\n\n if (res.status === 200) {\n setLastUpdateTime(newDate.getTime())\n\n reportUpdate({\n id,\n entitySlug,\n updatedAt: newDate.toISOString(),\n })\n\n if (!mostRecentVersionIsAutosaved) {\n incrementVersionCount()\n setMostRecentVersionIsAutosaved(true)\n setUnpublishedVersionCount((prev) => prev + 1)\n }\n }\n\n return res.json()\n })\n .then((json) => {\n if (versionsConfig?.drafts && versionsConfig?.drafts?.validate && json?.errors) {\n if (Array.isArray(json.errors)) {\n const [fieldErrors, nonFieldErrors] = json.errors.reduce(\n ([fieldErrs, nonFieldErrs], err) => {\n const newFieldErrs = []\n const newNonFieldErrs = []\n\n if (err?.message) {\n newNonFieldErrs.push(err)\n }\n\n if (Array.isArray(err?.data)) {\n err.data.forEach((dataError) => {\n if (dataError?.field) {\n newFieldErrs.push(dataError)\n } else {\n newNonFieldErrs.push(dataError)\n }\n })\n }\n\n return [\n [...fieldErrs, ...newFieldErrs],\n [...nonFieldErrs, ...newNonFieldErrs],\n ]\n },\n [[], []],\n )\n\n dispatchFields({\n type: 'ADD_SERVER_ERRORS',\n errors: fieldErrors,\n })\n\n nonFieldErrors.forEach((err) => {\n toast.error(err.message || i18n.t('error:unknown'))\n })\n\n setSubmitted(true)\n setSaving(false)\n return\n }\n } else {\n // If it's not an error then we can update the document data inside the context\n const document = json?.doc || json?.result\n\n // Manually update the data since this function doesn't fire the `submit` function from useForm\n if (document) {\n updateSavedDocumentData(document)\n }\n }\n })\n .then(() => {\n // If request was faster than minimum animation time, animate the difference\n if (endTimestamp - startTimestamp < minimumAnimationTime) {\n autosaveTimeout = setTimeout(\n () => {\n setSaving(false)\n },\n minimumAnimationTime - (endTimestamp - startTimestamp),\n )\n } else {\n setSaving(false)\n }\n })\n }\n }\n }\n }\n }\n\n queueRef.current.push(autosave)\n void processQueue()\n\n return { abortController, autosaveTimeout }\n })\n\n // When debounced fields change, autosave\n useEffect(() => {\n const { abortController, autosaveTimeout } = handleAutosave()\n\n return () => {\n if (autosaveTimeout) {\n clearTimeout(autosaveTimeout)\n }\n if (abortController.signal) {\n try {\n abortController.abort('Autosave closed early.')\n } catch (error) {\n // swallow error\n }\n }\n setSaving(false)\n }\n }, [debouncedFields])\n\n return (\n <div className={baseClass}>\n {saving && t('general:saving')}\n {!saving && Boolean(lastUpdateTime) && (\n <React.Fragment>\n {t('version:lastSavedAgo', {\n distance: formatTimeToNow({ date: lastUpdateTime, i18n }),\n })}\n </React.Fragment>\n )}\n </div>\n )\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["dequal","reduceFieldsToValues","versionDefaults","React","useDeferredValue","useEffect","useRef","useState","toast","useAllFormFields","useForm","useFormModified","useFormSubmitted","useDebounce","useEffectEvent","useConfig","useDocumentEvents","useDocumentInfo","useLocale","useTranslation","formatTimeToNow","reduceFieldsToValuesWithValidation","LeaveWithoutSaving","baseClass","minimumAnimationTime","Autosave","id","collection","global","globalDoc","config","routes","api","serverURL","docConfig","incrementVersionCount","lastUpdateTime","mostRecentVersionIsAutosaved","setLastUpdateTime","setMostRecentVersionIsAutosaved","setUnpublishedVersionCount","updateSavedDocumentData","queueRef","isProcessingRef","reportUpdate","dispatchFields","isValid","setIsValid","setSubmitted","fields","modified","submitted","code","locale","i18n","t","versionsConfig","versions","interval","autosaveInterval","drafts","autosave","validateOnDraft","Boolean","validate","_saving","setSaving","saving","debouncedFields","fieldRef","modifiedRef","localeRef","isValidRef","current","processQueue","useCallback","length","latestAction","autosaveTimeoutRef","handleAutosave","undefined","startTimestamp","endTimestamp","hideIndicator","setTimeout","stopAutoSaveIndicator","Date","getTime","url","method","entitySlug","slug","data","valid","_status","skipSubmission","res","fetch","body","JSON","stringify","credentials","headers","language","error","newDate","status","updatedAt","toISOString","prev","json","errors","Array","isArray","fieldErrors","nonFieldErrors","reduce","fieldErrs","nonFieldErrs","err","newFieldErrs","newNonFieldErrs","message","push","forEach","dataError","field","type","document","doc","result","didMount","previousDebouncedFieldValues","debouncedFieldValues","clearTimeout","_jsxs","className","_jsx","Fragment","distance","date"],"sources":["../../../src/elements/Autosave/index.tsx"],"sourcesContent":["'use client'\n// TODO: abstract the `next/navigation` dependency out from this component\nimport type { ClientCollectionConfig, ClientGlobalConfig } from 'payload'\n\nimport { dequal } from 'dequal/lite'\nimport { reduceFieldsToValues, versionDefaults } from 'payload/shared'\nimport React, { useDeferredValue, useEffect, useRef, useState } from 'react'\nimport { toast } from 'sonner'\n\nimport {\n useAllFormFields,\n useForm,\n useFormModified,\n useFormSubmitted,\n} from '../../forms/Form/context.js'\nimport { useDebounce } from '../../hooks/useDebounce.js'\nimport { useEffectEvent } from '../../hooks/useEffectEvent.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useDocumentEvents } from '../../providers/DocumentEvents/index.js'\nimport { useDocumentInfo } from '../../providers/DocumentInfo/index.js'\nimport { useLocale } from '../../providers/Locale/index.js'\nimport './index.scss'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { formatTimeToNow } from '../../utilities/formatDate.js'\nimport { reduceFieldsToValuesWithValidation } from '../../utilities/reduceFieldsToValuesWithValidation.js'\nimport { LeaveWithoutSaving } from '../LeaveWithoutSaving/index.js'\n\nconst baseClass = 'autosave'\n// The minimum time the saving state should be shown\nconst minimumAnimationTime = 1000\n\nexport type Props = {\n collection?: ClientCollectionConfig\n global?: ClientGlobalConfig\n id?: number | string\n publishedDocUpdatedAt: string\n}\n\nexport const Autosave: React.FC<Props> = ({ id, collection, global: globalDoc }) => {\n const {\n config: {\n routes: { api },\n serverURL,\n },\n } = useConfig()\n const {\n docConfig,\n incrementVersionCount,\n lastUpdateTime,\n mostRecentVersionIsAutosaved,\n setLastUpdateTime,\n setMostRecentVersionIsAutosaved,\n setUnpublishedVersionCount,\n updateSavedDocumentData,\n } = useDocumentInfo()\n const queueRef = useRef([])\n const isProcessingRef = useRef(false)\n\n const { reportUpdate } = useDocumentEvents()\n const { dispatchFields, isValid, setIsValid, setSubmitted } = useForm()\n\n const [fields] = useAllFormFields()\n const modified = useFormModified()\n const submitted = useFormSubmitted()\n\n const { code: locale } = useLocale()\n const { i18n, t } = useTranslation()\n\n const versionsConfig = docConfig?.versions\n let interval = versionDefaults.autosaveInterval\n\n if (versionsConfig.drafts && versionsConfig.drafts.autosave) {\n interval = versionsConfig.drafts.autosave.interval\n }\n\n const validateOnDraft = Boolean(\n docConfig?.versions?.drafts && docConfig?.versions?.drafts.validate,\n )\n\n const [_saving, setSaving] = useState(false)\n const saving = useDeferredValue(_saving)\n const debouncedFields = useDebounce(fields, interval)\n const fieldRef = useRef(fields)\n const modifiedRef = useRef(modified)\n const localeRef = useRef(locale)\n /**\n * Track the validation internally so Autosave can determine when to run queue processing again\n * Helps us prevent infinite loops when the queue is processing and the form is invalid\n */\n const isValidRef = useRef(isValid)\n\n // Store fields in ref so the autosave func\n // can always retrieve the most to date copies\n // after the timeout has executed\n fieldRef.current = fields\n\n // Store modified in ref so the autosave func\n // can bail out if modified becomes false while\n // timing out during autosave\n modifiedRef.current = modified\n\n // Store locale in ref so the autosave func\n // can always retrieve the most to date locale\n localeRef.current = locale\n\n const processQueue = React.useCallback(async () => {\n if (isProcessingRef.current || queueRef.current.length === 0) {\n return\n }\n\n if (!isValidRef.current) {\n // Clear queue so we don't end up in an infinite loop\n queueRef.current = []\n // Reset internal validation state so queue processing can run again\n isValidRef.current = true\n return\n }\n isProcessingRef.current = true\n\n const latestAction = queueRef.current[queueRef.current.length - 1]\n queueRef.current = []\n\n try {\n await latestAction()\n } finally {\n isProcessingRef.current = false\n if (queueRef.current.length > 0) {\n await processQueue()\n }\n }\n }, [])\n\n const autosaveTimeoutRef = useRef<NodeJS.Timeout | null>(null)\n\n const handleAutosave = useEffectEvent(() => {\n autosaveTimeoutRef.current = undefined\n // We need to log the time in order to figure out if we need to trigger the state off later\n let startTimestamp = undefined\n let endTimestamp = undefined\n\n const hideIndicator = () => {\n // If request was faster than minimum animation time, animate the difference\n if (endTimestamp - startTimestamp < minimumAnimationTime) {\n autosaveTimeoutRef.current = setTimeout(\n () => {\n setSaving(false)\n },\n minimumAnimationTime - (endTimestamp - startTimestamp),\n )\n } else {\n stopAutoSaveIndicator()\n }\n }\n\n const autosave = async () => {\n if (modified) {\n startTimestamp = new Date().getTime()\n\n setSaving(true)\n\n let url: string\n let method: string\n let entitySlug: string\n\n if (collection && id) {\n entitySlug = collection.slug\n url = `${serverURL}${api}/${entitySlug}/${id}?draft=true&autosave=true&locale=${localeRef.current}`\n method = 'PATCH'\n }\n\n if (globalDoc) {\n entitySlug = globalDoc.slug\n url = `${serverURL}${api}/globals/${entitySlug}?draft=true&autosave=true&locale=${localeRef.current}`\n method = 'POST'\n }\n\n if (url) {\n if (modifiedRef.current) {\n const { data, valid } = reduceFieldsToValuesWithValidation(fieldRef.current, true)\n\n data._status = 'draft'\n\n const skipSubmission =\n submitted && !valid && versionsConfig?.drafts && versionsConfig?.drafts?.validate\n\n if (!skipSubmission && isValidRef.current) {\n let res\n try {\n res = await fetch(url, {\n body: JSON.stringify(data),\n credentials: 'include',\n headers: {\n 'Accept-Language': i18n.language,\n 'Content-Type': 'application/json',\n },\n method,\n })\n } catch (error) {\n // Swallow Error\n }\n\n const newDate = new Date()\n // We need to log the time in order to figure out if we need to trigger the state off later\n endTimestamp = newDate.getTime()\n\n if (res.status === 200) {\n setLastUpdateTime(newDate.getTime())\n\n reportUpdate({\n id,\n entitySlug,\n updatedAt: newDate.toISOString(),\n })\n\n if (!mostRecentVersionIsAutosaved) {\n incrementVersionCount()\n setMostRecentVersionIsAutosaved(true)\n setUnpublishedVersionCount((prev) => prev + 1)\n }\n }\n const json = await res.json()\n\n if (versionsConfig?.drafts && versionsConfig?.drafts?.validate && json?.errors) {\n if (Array.isArray(json.errors)) {\n const [fieldErrors, nonFieldErrors] = json.errors.reduce(\n ([fieldErrs, nonFieldErrs], err) => {\n const newFieldErrs = []\n const newNonFieldErrs = []\n\n if (err?.message) {\n newNonFieldErrs.push(err)\n }\n\n if (Array.isArray(err?.data)) {\n err.data.forEach((dataError) => {\n if (dataError?.field) {\n newFieldErrs.push(dataError)\n } else {\n newNonFieldErrs.push(dataError)\n }\n })\n }\n\n return [\n [...fieldErrs, ...newFieldErrs],\n [...nonFieldErrs, ...newNonFieldErrs],\n ]\n },\n [[], []],\n )\n\n dispatchFields({\n type: 'ADD_SERVER_ERRORS',\n errors: fieldErrors,\n })\n\n nonFieldErrors.forEach((err) => {\n toast.error(err.message || i18n.t('error:unknown'))\n })\n\n // Set valid to false internally so the queue doesn't process\n isValidRef.current = false\n setIsValid(false)\n setSubmitted(true)\n hideIndicator()\n return\n }\n } else {\n // If it's not an error then we can update the document data inside the context\n const document = json?.doc || json?.result\n\n // Manually update the data since this function doesn't fire the `submit` function from useForm\n if (document) {\n setIsValid(true)\n\n // Reset internal state allowing the queue to process\n isValidRef.current = true\n updateSavedDocumentData(document)\n }\n }\n\n hideIndicator()\n }\n }\n }\n }\n }\n\n queueRef.current.push(autosave)\n void processQueue()\n })\n\n const didMount = useRef(false)\n const previousDebouncedFieldValues = useRef(reduceFieldsToValues(debouncedFields))\n // When debounced fields change, autosave\n useEffect(() => {\n /**\n * Ensure autosave doesn't run on mount\n */\n if (!didMount.current) {\n didMount.current = true\n return\n }\n\n /**\n * Ensure autosave only runs if the form data changes, not every time the entire form state changes\n */\n const debouncedFieldValues = reduceFieldsToValues(debouncedFields)\n if (dequal(debouncedFieldValues, previousDebouncedFieldValues)) {\n return\n }\n\n previousDebouncedFieldValues.current = debouncedFieldValues\n\n handleAutosave()\n }, [debouncedFields])\n\n /**\n * If component unmounts, clear the autosave timeout\n */\n useEffect(() => {\n return () => {\n stopAutoSaveIndicator()\n }\n }, [])\n\n const stopAutoSaveIndicator = useEffectEvent(() => {\n if (autosaveTimeoutRef.current) {\n clearTimeout(autosaveTimeoutRef.current)\n }\n\n setSaving(false)\n })\n\n return (\n <div className={baseClass}>\n {validateOnDraft && !isValid && <LeaveWithoutSaving />}\n {saving && t('general:saving')}\n {!saving && Boolean(lastUpdateTime) && (\n <React.Fragment>\n {t('version:lastSavedAgo', {\n distance: formatTimeToNow({ date: lastUpdateTime, i18n }),\n })}\n </React.Fragment>\n )}\n </div>\n )\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"DrawerContent.d.ts","sourceRoot":"","sources":["../../../../src/elements/BulkUpload/EditMany/DrawerContent.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAuB,MAAM,SAAS,CAAA;AAI1E,OAAO,KAAgC,MAAM,OAAO,CAAA;AAGpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAWvD,OAAO,EAAa,KAAK,wBAAwB,EAAE,MAAM,YAAY,CAAA;AACrE,OAAO,cAAc,CAAA;AAErB,eAAO,MAAM,gCAAgC,EAAE,KAAK,CAAC,EAAE,CACrD;IACE,UAAU,EAAE,sBAAsB,CAAA;IAClC,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;CACtB,GAAG,wBAAwB,CAuE7B,CAAA"}
1
+ {"version":3,"file":"DrawerContent.d.ts","sourceRoot":"","sources":["../../../../src/elements/BulkUpload/EditMany/DrawerContent.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAuB,MAAM,SAAS,CAAA;AAI1E,OAAO,KAAgC,MAAM,OAAO,CAAA;AAGpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAWvD,OAAO,EAAa,KAAK,wBAAwB,EAAE,MAAM,YAAY,CAAA;AACrE,OAAO,cAAc,CAAA;AAErB,eAAO,MAAM,gCAAgC,EAAE,KAAK,CAAC,EAAE,CACrD;IACE,UAAU,EAAE,sBAAsB,CAAA;IAClC,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;CACtB,GAAG,wBAAwB,CA2E7B,CAAA"}
@@ -17,7 +17,7 @@ import { useFormsManager } from '../FormsManager/index.js';
17
17
  import { baseClass } from './index.js';
18
18
  import './index.scss';
19
19
  export const EditManyBulkUploadsDrawerContent = props => {
20
- const $ = _c(23);
20
+ const $ = _c(24);
21
21
  const {
22
22
  collection: t0,
23
23
  drawerSlug,
@@ -37,7 +37,8 @@ export const EditManyBulkUploadsDrawerContent = props => {
37
37
  labels: t2
38
38
  } = t1;
39
39
  const {
40
- plural
40
+ plural,
41
+ singular
41
42
  } = t2;
42
43
  const {
43
44
  permissions
@@ -62,10 +63,10 @@ export const EditManyBulkUploadsDrawerContent = props => {
62
63
  const [selectedFields, setSelectedFields] = useState(t3);
63
64
  const collectionPermissions = permissions?.collections?.[slug];
64
65
  let t4;
65
- if ($[3] !== bulkUpdateForm || $[4] !== closeModal || $[5] !== collectionPermissions?.fields || $[6] !== drawerSlug || $[7] !== fields || $[8] !== forms.length || $[9] !== i18n || $[10] !== plural || $[11] !== selectedFields || $[12] !== slug || $[13] !== t) {
66
+ if ($[3] !== bulkUpdateForm || $[4] !== closeModal || $[5] !== collectionPermissions?.fields || $[6] !== drawerSlug || $[7] !== fields || $[8] !== forms.length || $[9] !== i18n || $[10] !== plural || $[11] !== selectedFields || $[12] !== singular || $[13] !== slug || $[14] !== t) {
66
67
  const filteredFields = filterOutUploadFields(fields);
67
68
  let t5;
68
- if ($[15] !== bulkUpdateForm || $[16] !== closeModal || $[17] !== drawerSlug || $[18] !== selectedFields) {
69
+ if ($[16] !== bulkUpdateForm || $[17] !== closeModal || $[18] !== drawerSlug || $[19] !== selectedFields) {
69
70
  t5 = formState => {
70
71
  const pairedData = selectedFields.reduce((acc, field) => {
71
72
  const {
@@ -78,23 +79,23 @@ export const EditManyBulkUploadsDrawerContent = props => {
78
79
  }, {});
79
80
  bulkUpdateForm(pairedData, () => closeModal(drawerSlug));
80
81
  };
81
- $[15] = bulkUpdateForm;
82
- $[16] = closeModal;
83
- $[17] = drawerSlug;
84
- $[18] = selectedFields;
85
- $[19] = t5;
82
+ $[16] = bulkUpdateForm;
83
+ $[17] = closeModal;
84
+ $[18] = drawerSlug;
85
+ $[19] = selectedFields;
86
+ $[20] = t5;
86
87
  } else {
87
- t5 = $[19];
88
+ t5 = $[20];
88
89
  }
89
90
  const handleSubmit = t5;
90
91
  let t6;
91
- if ($[20] !== closeModal || $[21] !== drawerSlug) {
92
+ if ($[21] !== closeModal || $[22] !== drawerSlug) {
92
93
  t6 = () => closeModal(drawerSlug);
93
- $[20] = closeModal;
94
- $[21] = drawerSlug;
95
- $[22] = t6;
94
+ $[21] = closeModal;
95
+ $[22] = drawerSlug;
96
+ $[23] = t6;
96
97
  } else {
97
- t6 = $[22];
98
+ t6 = $[23];
98
99
  }
99
100
  t4 = _jsxs("div", {
100
101
  className: `${baseClass}__main`,
@@ -104,7 +105,7 @@ export const EditManyBulkUploadsDrawerContent = props => {
104
105
  className: `${baseClass}__header__title`,
105
106
  children: t("general:editingLabel", {
106
107
  count: forms.length,
107
- label: getTranslation(plural, i18n)
108
+ label: getTranslation(forms.length > 1 ? plural : singular, i18n)
108
109
  })
109
110
  }), _jsx("button", {
110
111
  "aria-label": t("general:close"),
@@ -155,11 +156,12 @@ export const EditManyBulkUploadsDrawerContent = props => {
155
156
  $[9] = i18n;
156
157
  $[10] = plural;
157
158
  $[11] = selectedFields;
158
- $[12] = slug;
159
- $[13] = t;
160
- $[14] = t4;
159
+ $[12] = singular;
160
+ $[13] = slug;
161
+ $[14] = t;
162
+ $[15] = t4;
161
163
  } else {
162
- t4 = $[14];
164
+ t4 = $[15];
163
165
  }
164
166
  return t4;
165
167
  };
@@ -1 +1 @@
1
- {"version":3,"file":"DrawerContent.js","names":["c","_c","useModal","getTranslation","React","useCallback","useState","Button","Form","RenderFields","XIcon","useAuth","useTranslation","filterOutUploadFields","FieldSelect","useFormsManager","baseClass","EditManyBulkUploadsDrawerContent","props","$","collection","t0","drawerSlug","forms","t1","undefined","slug","fields","labels","t2","plural","permissions","i18n","t","closeModal","bulkUpdateForm","t3","Symbol","for","selectedFields","setSelectedFields","collectionPermissions","collections","t4","length","filteredFields","t5","formState","pairedData","reduce","acc","field","path","value","handleSubmit","t6","_jsxs","className","children","_jsx","count","label","id","onClick","type","initialState","onSubmit","setSelected","parentIndexPath","parentPath","parentSchemaPath","readOnly"],"sources":["../../../../src/elements/BulkUpload/EditMany/DrawerContent.tsx"],"sourcesContent":["'use client'\n\nimport type { ClientCollectionConfig, FieldWithPathClient } from 'payload'\n\nimport { useModal } from '@faceless-ui/modal'\nimport { getTranslation } from '@payloadcms/translations'\nimport React, { useCallback, useState } from 'react'\n\nimport type { FormProps } from '../../../forms/Form/index.js'\nimport type { State } from '../FormsManager/reducer.js'\n\nimport { Button } from '../../../elements/Button/index.js'\nimport { Form } from '../../../forms/Form/index.js'\nimport { RenderFields } from '../../../forms/RenderFields/index.js'\nimport { XIcon } from '../../../icons/X/index.js'\nimport { useAuth } from '../../../providers/Auth/index.js'\nimport { useTranslation } from '../../../providers/Translation/index.js'\nimport { filterOutUploadFields } from '../../../utilities/filterOutUploadFields.js'\nimport { FieldSelect } from '../../FieldSelect/index.js'\nimport { useFormsManager } from '../FormsManager/index.js'\nimport { baseClass, type EditManyBulkUploadsProps } from './index.js'\nimport './index.scss'\n\nexport const EditManyBulkUploadsDrawerContent: React.FC<\n {\n collection: ClientCollectionConfig\n drawerSlug: string\n forms: State['forms']\n } & EditManyBulkUploadsProps\n> = (props) => {\n const { collection: { slug, fields, labels: { plural } } = {}, drawerSlug, forms } = props\n\n const { permissions } = useAuth()\n const { i18n, t } = useTranslation()\n const { closeModal } = useModal()\n const { bulkUpdateForm } = useFormsManager()\n\n const [selectedFields, setSelectedFields] = useState<FieldWithPathClient[]>([])\n const collectionPermissions = permissions?.collections?.[slug]\n const filteredFields = filterOutUploadFields(fields)\n\n const handleSubmit: FormProps['onSubmit'] = useCallback(\n (formState) => {\n const pairedData = selectedFields.reduce((acc, field) => {\n const { path } = field\n if (formState[path]) {\n acc[path] = formState[path].value\n }\n return acc\n }, {})\n\n void bulkUpdateForm(pairedData, () => closeModal(drawerSlug))\n },\n [closeModal, drawerSlug, bulkUpdateForm, selectedFields],\n )\n\n return (\n <div className={`${baseClass}__main`}>\n <div className={`${baseClass}__header`}>\n <h2 className={`${baseClass}__header__title`}>\n {t('general:editingLabel', {\n count: forms.length,\n label: getTranslation(plural, i18n),\n })}\n </h2>\n <button\n aria-label={t('general:close')}\n className={`${baseClass}__header__close`}\n id={`close-drawer__${drawerSlug}`}\n onClick={() => closeModal(drawerSlug)}\n type=\"button\"\n >\n <XIcon />\n </button>\n </div>\n <Form className={`${baseClass}__form`} initialState={{}} onSubmit={handleSubmit}>\n <FieldSelect fields={filteredFields} setSelected={setSelectedFields} />\n {selectedFields.length === 0 ? null : (\n <RenderFields\n fields={selectedFields}\n parentIndexPath=\"\"\n parentPath=\"\"\n parentSchemaPath={slug}\n permissions={collectionPermissions?.fields}\n readOnly={false}\n />\n )}\n <div className={`${baseClass}__sidebar-wrap`}>\n <div className={`${baseClass}__sidebar`}>\n <div className={`${baseClass}__sidebar-sticky-wrap`}>\n <div className={`${baseClass}__document-actions`}>\n <Button type=\"submit\">{t('general:applyChanges')}</Button>\n </div>\n </div>\n </div>\n </div>\n </Form>\n </div>\n )\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"DrawerContent.js","names":["c","_c","useModal","getTranslation","React","useCallback","useState","Button","Form","RenderFields","XIcon","useAuth","useTranslation","filterOutUploadFields","FieldSelect","useFormsManager","baseClass","EditManyBulkUploadsDrawerContent","props","$","collection","t0","drawerSlug","forms","t1","undefined","slug","fields","labels","t2","plural","singular","permissions","i18n","t","closeModal","bulkUpdateForm","t3","Symbol","for","selectedFields","setSelectedFields","collectionPermissions","collections","t4","length","filteredFields","t5","formState","pairedData","reduce","acc","field","path","value","handleSubmit","t6","_jsxs","className","children","_jsx","count","label","id","onClick","type","initialState","onSubmit","setSelected","parentIndexPath","parentPath","parentSchemaPath","readOnly"],"sources":["../../../../src/elements/BulkUpload/EditMany/DrawerContent.tsx"],"sourcesContent":["'use client'\n\nimport type { ClientCollectionConfig, FieldWithPathClient } from 'payload'\n\nimport { useModal } from '@faceless-ui/modal'\nimport { getTranslation } from '@payloadcms/translations'\nimport React, { useCallback, useState } from 'react'\n\nimport type { FormProps } from '../../../forms/Form/index.js'\nimport type { State } from '../FormsManager/reducer.js'\n\nimport { Button } from '../../../elements/Button/index.js'\nimport { Form } from '../../../forms/Form/index.js'\nimport { RenderFields } from '../../../forms/RenderFields/index.js'\nimport { XIcon } from '../../../icons/X/index.js'\nimport { useAuth } from '../../../providers/Auth/index.js'\nimport { useTranslation } from '../../../providers/Translation/index.js'\nimport { filterOutUploadFields } from '../../../utilities/filterOutUploadFields.js'\nimport { FieldSelect } from '../../FieldSelect/index.js'\nimport { useFormsManager } from '../FormsManager/index.js'\nimport { baseClass, type EditManyBulkUploadsProps } from './index.js'\nimport './index.scss'\n\nexport const EditManyBulkUploadsDrawerContent: React.FC<\n {\n collection: ClientCollectionConfig\n drawerSlug: string\n forms: State['forms']\n } & EditManyBulkUploadsProps\n> = (props) => {\n const {\n collection: { slug, fields, labels: { plural, singular } } = {},\n drawerSlug,\n forms,\n } = props\n\n const { permissions } = useAuth()\n const { i18n, t } = useTranslation()\n const { closeModal } = useModal()\n const { bulkUpdateForm } = useFormsManager()\n\n const [selectedFields, setSelectedFields] = useState<FieldWithPathClient[]>([])\n const collectionPermissions = permissions?.collections?.[slug]\n const filteredFields = filterOutUploadFields(fields)\n\n const handleSubmit: FormProps['onSubmit'] = useCallback(\n (formState) => {\n const pairedData = selectedFields.reduce((acc, field) => {\n const { path } = field\n if (formState[path]) {\n acc[path] = formState[path].value\n }\n return acc\n }, {})\n\n void bulkUpdateForm(pairedData, () => closeModal(drawerSlug))\n },\n [closeModal, drawerSlug, bulkUpdateForm, selectedFields],\n )\n\n return (\n <div className={`${baseClass}__main`}>\n <div className={`${baseClass}__header`}>\n <h2 className={`${baseClass}__header__title`}>\n {t('general:editingLabel', {\n count: forms.length,\n label: getTranslation(forms.length > 1 ? plural : singular, i18n),\n })}\n </h2>\n <button\n aria-label={t('general:close')}\n className={`${baseClass}__header__close`}\n id={`close-drawer__${drawerSlug}`}\n onClick={() => closeModal(drawerSlug)}\n type=\"button\"\n >\n <XIcon />\n </button>\n </div>\n <Form className={`${baseClass}__form`} initialState={{}} onSubmit={handleSubmit}>\n <FieldSelect fields={filteredFields} setSelected={setSelectedFields} />\n {selectedFields.length === 0 ? null : (\n <RenderFields\n fields={selectedFields}\n parentIndexPath=\"\"\n parentPath=\"\"\n parentSchemaPath={slug}\n permissions={collectionPermissions?.fields}\n readOnly={false}\n />\n )}\n <div className={`${baseClass}__sidebar-wrap`}>\n <div className={`${baseClass}__sidebar`}>\n <div className={`${baseClass}__sidebar-sticky-wrap`}>\n <div className={`${baseClass}__document-actions`}>\n <Button type=\"submit\">{t('general:applyChanges')}</Button>\n </div>\n </div>\n </div>\n </div>\n </Form>\n </div>\n )\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/Button/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAmC,MAAM,OAAO,CAAA;AAEvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAWvC,OAAO,cAAc,CAAA;AAarB,eAAO,MAAM,cAAc;;;;;uBAqB1B,CAAA;AAED,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAmJlC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/Button/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAmC,MAAM,OAAO,CAAA;AAEvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAWvC,OAAO,cAAc,CAAA;AAarB,eAAO,MAAM,cAAc;;;;;uBAqB1B,CAAA;AAED,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAoJlC,CAAA"}
@@ -161,6 +161,7 @@ export const Button = props => {
161
161
  className: disabled && !enableSubMenu ? `${baseClass}--popup-disabled` : '',
162
162
  disabled: disabled && !enableSubMenu,
163
163
  horizontalAlign: "right",
164
+ id: `${id}-popup`,
164
165
  noBackground: true,
165
166
  render: ({
166
167
  close