@payloadcms/ui 3.0.0-beta.90 → 3.0.0-beta.92
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/elements/AddNewRelation/index.d.ts.map +1 -1
- package/dist/elements/AddNewRelation/index.js +1 -1
- package/dist/elements/AddNewRelation/index.js.map +1 -1
- package/dist/elements/AddNewRelation/index.scss +14 -4
- package/dist/elements/AppHeader/index.js +41 -80
- package/dist/elements/AppHeader/index.js.map +1 -1
- package/dist/elements/Autosave/index.js +148 -231
- package/dist/elements/Autosave/index.js.map +1 -1
- package/dist/elements/Button/index.js +86 -218
- package/dist/elements/Button/index.js.map +1 -1
- package/dist/elements/Collapsible/index.js +44 -62
- package/dist/elements/Collapsible/index.js.map +1 -1
- package/dist/elements/Collapsible/index.scss +15 -28
- package/dist/elements/CopyToClipboard/index.js +20 -54
- package/dist/elements/CopyToClipboard/index.js.map +1 -1
- package/dist/elements/Dropzone/index.js +59 -119
- package/dist/elements/Dropzone/index.js.map +1 -1
- package/dist/elements/EditMany/index.js +124 -230
- package/dist/elements/EditMany/index.js.map +1 -1
- package/dist/elements/EditUpload/index.js +133 -206
- package/dist/elements/EditUpload/index.js.map +1 -1
- package/dist/elements/ListControls/index.js +82 -188
- package/dist/elements/ListControls/index.js.map +1 -1
- package/dist/elements/Nav/context.js +47 -83
- package/dist/elements/Nav/context.js.map +1 -1
- package/dist/elements/SaveButton/index.js +30 -81
- package/dist/elements/SaveButton/index.js.map +1 -1
- package/dist/elements/SaveDraftButton/index.js +54 -116
- package/dist/elements/SaveDraftButton/index.js.map +1 -1
- package/dist/elements/SearchFilter/index.js +21 -77
- package/dist/elements/SearchFilter/index.js.map +1 -1
- package/dist/elements/Upload/index.js +130 -280
- package/dist/elements/Upload/index.js.map +1 -1
- package/dist/exports/client/{CodeEditor-C4FLUUO7.js → CodeEditor-MTP455NO.js} +2 -2
- package/dist/exports/client/chunk-NJHSEGFB.js +14 -0
- package/dist/exports/client/{chunk-UGBVRIVY.js.map → chunk-NJHSEGFB.js.map} +2 -2
- package/dist/exports/client/index.d.ts +1 -1
- package/dist/exports/client/index.d.ts.map +1 -1
- package/dist/exports/client/index.js +19 -19
- package/dist/exports/client/index.js.map +3 -3
- package/dist/fields/Relationship/index.js +318 -504
- package/dist/fields/Relationship/index.js.map +1 -1
- package/dist/fields/Upload/HasMany/index.d.ts.map +1 -1
- package/dist/fields/Upload/HasMany/index.js +192 -422
- package/dist/fields/Upload/HasMany/index.js.map +1 -1
- package/dist/fields/Upload/HasMany/index.scss +19 -1
- package/dist/forms/Submit/index.js +12 -28
- package/dist/forms/Submit/index.js.map +1 -1
- package/dist/hooks/useDelay.js +15 -48
- package/dist/hooks/useDelay.js.map +1 -1
- package/dist/hooks/useDelayedRender.js +32 -71
- package/dist/hooks/useDelayedRender.js.map +1 -1
- package/dist/hooks/useIntersect.js +14 -20
- package/dist/hooks/useIntersect.js.map +1 -1
- package/dist/providers/Config/createClientConfig/collections.d.ts.map +1 -1
- package/dist/providers/Config/createClientConfig/collections.js +8 -6
- package/dist/providers/Config/createClientConfig/collections.js.map +1 -1
- package/dist/providers/Preferences/index.js +1 -3
- package/dist/providers/Preferences/index.js.map +1 -1
- package/dist/providers/Selection/index.js +102 -190
- package/dist/providers/Selection/index.js.map +1 -1
- package/dist/scss/app.scss +6 -6
- package/dist/scss/type.scss +4 -4
- package/dist/styles.css +1 -1
- package/package.json +9 -9
- package/dist/exports/client/chunk-UGBVRIVY.js +0 -14
- /package/dist/exports/client/{CodeEditor-C4FLUUO7.js.map → CodeEditor-MTP455NO.js.map} +0 -0
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import { c as _c } from "react/compiler-runtime";
|
|
4
3
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
5
4
|
import { versionDefaults } from 'payload/shared';
|
|
6
5
|
import React, { useEffect, useRef, useState } from 'react';
|
|
@@ -18,24 +17,20 @@ import './index.scss';
|
|
|
18
17
|
const baseClass = 'autosave';
|
|
19
18
|
// The minimum time the saving state should be shown
|
|
20
19
|
const minimumAnimationTime = 1000;
|
|
21
|
-
export const Autosave =
|
|
22
|
-
|
|
20
|
+
export const Autosave = ({
|
|
21
|
+
id,
|
|
22
|
+
collection,
|
|
23
|
+
global: globalDoc,
|
|
24
|
+
publishedDocUpdatedAt
|
|
25
|
+
}) => {
|
|
23
26
|
const {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
config: t1
|
|
27
|
+
config: {
|
|
28
|
+
routes: {
|
|
29
|
+
api
|
|
30
|
+
},
|
|
31
|
+
serverURL
|
|
32
|
+
}
|
|
31
33
|
} = useConfig();
|
|
32
|
-
const {
|
|
33
|
-
routes: t2,
|
|
34
|
-
serverURL
|
|
35
|
-
} = t1;
|
|
36
|
-
const {
|
|
37
|
-
api
|
|
38
|
-
} = t2;
|
|
39
34
|
const {
|
|
40
35
|
docConfig,
|
|
41
36
|
getVersions,
|
|
@@ -61,9 +56,7 @@ export const Autosave = t0 => {
|
|
|
61
56
|
t
|
|
62
57
|
} = useTranslation();
|
|
63
58
|
let interval = versionDefaults.autosaveInterval;
|
|
64
|
-
if (versionsConfig.drafts && versionsConfig.drafts.autosave)
|
|
65
|
-
interval = versionsConfig.drafts.autosave.interval;
|
|
66
|
-
}
|
|
59
|
+
if (versionsConfig.drafts && versionsConfig.drafts.autosave) interval = versionsConfig.drafts.autosave.interval;
|
|
67
60
|
const [saving, setSaving] = useState(false);
|
|
68
61
|
const [lastSaved, setLastSaved] = useState();
|
|
69
62
|
const debouncedFields = useDebounce(fields, interval);
|
|
@@ -73,230 +66,154 @@ export const Autosave = t0 => {
|
|
|
73
66
|
const localeRef = useRef(locale);
|
|
74
67
|
const debouncedRef = useRef(debouncedFields);
|
|
75
68
|
debouncedRef.current = debouncedFields;
|
|
69
|
+
// Store fields in ref so the autosave func
|
|
70
|
+
// can always retrieve the most to date copies
|
|
71
|
+
// after the timeout has executed
|
|
76
72
|
fieldRef.current = fields;
|
|
73
|
+
// Store modified in ref so the autosave func
|
|
74
|
+
// can bail out if modified becomes false while
|
|
75
|
+
// timing out during autosave
|
|
77
76
|
modifiedRef.current = modified;
|
|
77
|
+
// Store locale in ref so the autosave func
|
|
78
|
+
// can always retrieve the most to date locale
|
|
78
79
|
localeRef.current = locale;
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
80
|
+
// When debounced fields change, autosave
|
|
81
|
+
useEffect(() => {
|
|
82
|
+
const abortController = new AbortController();
|
|
83
|
+
let autosaveTimeout = undefined;
|
|
84
|
+
// We need to log the time in order to figure out if we need to trigger the state off later
|
|
85
|
+
let startTimestamp = undefined;
|
|
86
|
+
let endTimestamp = undefined;
|
|
87
|
+
const autosave = () => {
|
|
88
|
+
if (modified) {
|
|
89
|
+
startTimestamp = new Date().getTime();
|
|
90
|
+
setSaving(true);
|
|
91
|
+
let url;
|
|
92
|
+
let method;
|
|
93
|
+
let entitySlug;
|
|
94
|
+
if (collection && id) {
|
|
95
|
+
entitySlug = collection.slug;
|
|
96
|
+
url = `${serverURL}${api}/${entitySlug}/${id}?draft=true&autosave=true&locale=${localeRef.current}`;
|
|
97
|
+
method = 'PATCH';
|
|
98
|
+
}
|
|
99
|
+
if (globalDoc) {
|
|
100
|
+
entitySlug = globalDoc.slug;
|
|
101
|
+
url = `${serverURL}${api}/globals/${entitySlug}?draft=true&autosave=true&locale=${localeRef.current}`;
|
|
102
|
+
method = 'POST';
|
|
103
|
+
}
|
|
104
|
+
if (url) {
|
|
105
|
+
if (modifiedRef.current) {
|
|
106
|
+
const {
|
|
107
|
+
data,
|
|
108
|
+
valid
|
|
109
|
+
} = {
|
|
110
|
+
...reduceFieldsToValuesWithValidation(fieldRef.current, true)
|
|
111
|
+
};
|
|
112
|
+
data._status = 'draft';
|
|
113
|
+
const skipSubmission = submitted && !valid && versionsConfig?.drafts && versionsConfig?.drafts?.validate;
|
|
114
|
+
if (!skipSubmission) {
|
|
115
|
+
void fetch(url, {
|
|
116
|
+
body: JSON.stringify(data),
|
|
117
|
+
credentials: 'include',
|
|
118
|
+
headers: {
|
|
119
|
+
'Accept-Language': i18n.language,
|
|
120
|
+
'Content-Type': 'application/json'
|
|
121
|
+
},
|
|
122
|
+
method,
|
|
123
|
+
signal: abortController.signal
|
|
124
|
+
}).then(res => {
|
|
125
|
+
const newDate = new Date();
|
|
126
|
+
// We need to log the time in order to figure out if we need to trigger the state off later
|
|
127
|
+
endTimestamp = newDate.getTime();
|
|
128
|
+
if (res.status === 200) {
|
|
129
|
+
setLastSaved(newDate.getTime());
|
|
130
|
+
reportUpdate({
|
|
131
|
+
id,
|
|
132
|
+
entitySlug,
|
|
133
|
+
updatedAt: newDate.toISOString()
|
|
134
|
+
});
|
|
135
|
+
setModified(false);
|
|
136
|
+
void getVersions();
|
|
137
|
+
} else {
|
|
138
|
+
return res.json();
|
|
139
|
+
}
|
|
140
|
+
}).then(json => {
|
|
141
|
+
if (versionsConfig?.drafts && versionsConfig?.drafts?.validate && json?.errors) {
|
|
142
|
+
if (Array.isArray(json.errors)) {
|
|
143
|
+
const [fieldErrors, nonFieldErrors] = json.errors.reduce(([fieldErrs, nonFieldErrs], err) => {
|
|
144
|
+
const newFieldErrs = [];
|
|
145
|
+
const newNonFieldErrs = [];
|
|
146
|
+
if (err?.message) {
|
|
147
|
+
newNonFieldErrs.push(err);
|
|
148
|
+
}
|
|
149
|
+
if (Array.isArray(err?.data)) {
|
|
150
|
+
err.data.forEach(dataError => {
|
|
151
|
+
if (dataError?.field) {
|
|
152
|
+
newFieldErrs.push(dataError);
|
|
153
|
+
} else {
|
|
154
|
+
newNonFieldErrs.push(dataError);
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
return [[...fieldErrs, ...newFieldErrs], [...nonFieldErrs, ...newNonFieldErrs]];
|
|
159
|
+
}, [[], []]);
|
|
160
|
+
dispatchFields({
|
|
161
|
+
type: 'ADD_SERVER_ERRORS',
|
|
162
|
+
errors: fieldErrors
|
|
135
163
|
});
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
}
|
|
141
|
-
}).then(json => {
|
|
142
|
-
if (versionsConfig?.drafts && versionsConfig?.drafts?.validate && json?.errors) {
|
|
143
|
-
if (Array.isArray(json.errors)) {
|
|
144
|
-
const [fieldErrors, nonFieldErrors] = json.errors.reduce((t4, err) => {
|
|
145
|
-
const [fieldErrs, nonFieldErrs] = t4;
|
|
146
|
-
const newFieldErrs = [];
|
|
147
|
-
const newNonFieldErrs = [];
|
|
148
|
-
if (err?.message) {
|
|
149
|
-
newNonFieldErrs.push(err);
|
|
150
|
-
}
|
|
151
|
-
if (Array.isArray(err?.data)) {
|
|
152
|
-
err.data.forEach(dataError => {
|
|
153
|
-
if (dataError?.field) {
|
|
154
|
-
newFieldErrs.push(dataError);
|
|
155
|
-
} else {
|
|
156
|
-
newNonFieldErrs.push(dataError);
|
|
157
|
-
}
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
return [[...fieldErrs, ...newFieldErrs], [...nonFieldErrs, ...newNonFieldErrs]];
|
|
161
|
-
}, [[], []]);
|
|
162
|
-
dispatchFields({
|
|
163
|
-
type: "ADD_SERVER_ERRORS",
|
|
164
|
-
errors: fieldErrors
|
|
165
|
-
});
|
|
166
|
-
nonFieldErrors.forEach(err_0 => {
|
|
167
|
-
toast.error(err_0.message || i18n.t("error:unknown"));
|
|
168
|
-
});
|
|
169
|
-
setSubmitted(true);
|
|
170
|
-
setSaving(false);
|
|
171
|
-
return;
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
}).then(() => {
|
|
175
|
-
if (endTimestamp - startTimestamp < minimumAnimationTime) {
|
|
176
|
-
autosaveTimeout = setTimeout(() => {
|
|
177
|
-
setSaving(false);
|
|
178
|
-
}, minimumAnimationTime - (endTimestamp - startTimestamp));
|
|
179
|
-
} else {
|
|
164
|
+
nonFieldErrors.forEach(err_0 => {
|
|
165
|
+
toast.error(err_0.message || i18n.t('error:unknown'));
|
|
166
|
+
});
|
|
167
|
+
setSubmitted(true);
|
|
180
168
|
setSaving(false);
|
|
169
|
+
return;
|
|
181
170
|
}
|
|
182
|
-
}
|
|
183
|
-
}
|
|
171
|
+
}
|
|
172
|
+
}).then(() => {
|
|
173
|
+
// If request was faster than minimum animation time, animate the difference
|
|
174
|
+
if (endTimestamp - startTimestamp < minimumAnimationTime) {
|
|
175
|
+
autosaveTimeout = setTimeout(() => {
|
|
176
|
+
setSaving(false);
|
|
177
|
+
}, minimumAnimationTime - (endTimestamp - startTimestamp));
|
|
178
|
+
} else {
|
|
179
|
+
setSaving(false);
|
|
180
|
+
}
|
|
181
|
+
});
|
|
184
182
|
}
|
|
185
183
|
}
|
|
186
184
|
}
|
|
187
|
-
}
|
|
188
|
-
autosave();
|
|
189
|
-
return () => {
|
|
190
|
-
if (autosaveTimeout) {
|
|
191
|
-
clearTimeout(autosaveTimeout);
|
|
192
|
-
}
|
|
193
|
-
if (abortController.signal) {
|
|
194
|
-
;
|
|
195
|
-
try {
|
|
196
|
-
abortController.abort("Autosave closed early.");
|
|
197
|
-
} catch (t5) {
|
|
198
|
-
const error = t5;
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
setSaving(false);
|
|
202
|
-
};
|
|
185
|
+
}
|
|
203
186
|
};
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
$[8] = i18n;
|
|
213
|
-
$[9] = reportUpdate;
|
|
214
|
-
$[10] = setModified;
|
|
215
|
-
$[11] = getVersions;
|
|
216
|
-
$[12] = dispatchFields;
|
|
217
|
-
$[13] = setSubmitted;
|
|
218
|
-
$[14] = t3;
|
|
219
|
-
} else {
|
|
220
|
-
t3 = $[14];
|
|
221
|
-
}
|
|
222
|
-
const t4 = versionsConfig?.drafts;
|
|
223
|
-
let t5;
|
|
224
|
-
if ($[15] !== api || $[16] !== collection || $[17] !== dispatchFields || $[18] !== getVersions || $[19] !== globalDoc || $[20] !== i18n || $[21] !== id || $[22] !== interval || $[23] !== modified || $[24] !== reportUpdate || $[25] !== serverURL || $[26] !== setSubmitted || $[27] !== setModified || $[28] !== t4 || $[29] !== debouncedFields || $[30] !== submitted) {
|
|
225
|
-
t5 = [api, collection, dispatchFields, getVersions, globalDoc, i18n, id, interval, modified, reportUpdate, serverURL, setSubmitted, setModified, t4, debouncedFields, submitted];
|
|
226
|
-
$[15] = api;
|
|
227
|
-
$[16] = collection;
|
|
228
|
-
$[17] = dispatchFields;
|
|
229
|
-
$[18] = getVersions;
|
|
230
|
-
$[19] = globalDoc;
|
|
231
|
-
$[20] = i18n;
|
|
232
|
-
$[21] = id;
|
|
233
|
-
$[22] = interval;
|
|
234
|
-
$[23] = modified;
|
|
235
|
-
$[24] = reportUpdate;
|
|
236
|
-
$[25] = serverURL;
|
|
237
|
-
$[26] = setSubmitted;
|
|
238
|
-
$[27] = setModified;
|
|
239
|
-
$[28] = t4;
|
|
240
|
-
$[29] = debouncedFields;
|
|
241
|
-
$[30] = submitted;
|
|
242
|
-
$[31] = t5;
|
|
243
|
-
} else {
|
|
244
|
-
t5 = $[31];
|
|
245
|
-
}
|
|
246
|
-
useEffect(t3, t5);
|
|
247
|
-
let t6;
|
|
248
|
-
let t7;
|
|
249
|
-
if ($[32] !== versions || $[33] !== publishedDocUpdatedAt) {
|
|
250
|
-
t6 = () => {
|
|
251
|
-
if (versions?.docs?.[0]) {
|
|
252
|
-
setLastSaved(new Date(versions.docs[0].updatedAt).getTime());
|
|
253
|
-
} else {
|
|
254
|
-
if (publishedDocUpdatedAt) {
|
|
255
|
-
setLastSaved(new Date(publishedDocUpdatedAt).getTime());
|
|
187
|
+
void autosave();
|
|
188
|
+
return () => {
|
|
189
|
+
if (autosaveTimeout) clearTimeout(autosaveTimeout);
|
|
190
|
+
if (abortController.signal) {
|
|
191
|
+
try {
|
|
192
|
+
abortController.abort('Autosave closed early.');
|
|
193
|
+
} catch (error) {
|
|
194
|
+
// swallow error
|
|
256
195
|
}
|
|
257
196
|
}
|
|
197
|
+
setSaving(false);
|
|
258
198
|
};
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
$[38] = t8;
|
|
275
|
-
} else {
|
|
276
|
-
t8 = $[38];
|
|
277
|
-
}
|
|
278
|
-
let t9;
|
|
279
|
-
if ($[39] !== saving || $[40] !== lastSaved || $[41] !== i18n || $[42] !== t || $[43] !== t8) {
|
|
280
|
-
t9 = _jsxs("div", {
|
|
281
|
-
className: baseClass,
|
|
282
|
-
children: [t8, !saving && Boolean(lastSaved) && _jsx(React.Fragment, {
|
|
283
|
-
children: t("version:lastSavedAgo", {
|
|
284
|
-
distance: formatTimeToNow({
|
|
285
|
-
date: lastSaved,
|
|
286
|
-
i18n
|
|
287
|
-
})
|
|
199
|
+
}, [api, collection, dispatchFields, getVersions, globalDoc, i18n, id, interval, modified, reportUpdate, serverURL, setSubmitted, setModified, versionsConfig?.drafts, debouncedFields, submitted]);
|
|
200
|
+
useEffect(() => {
|
|
201
|
+
if (versions?.docs?.[0]) {
|
|
202
|
+
setLastSaved(new Date(versions.docs[0].updatedAt).getTime());
|
|
203
|
+
} else if (publishedDocUpdatedAt) {
|
|
204
|
+
setLastSaved(new Date(publishedDocUpdatedAt).getTime());
|
|
205
|
+
}
|
|
206
|
+
}, [publishedDocUpdatedAt, versions]);
|
|
207
|
+
return /*#__PURE__*/_jsxs("div", {
|
|
208
|
+
className: baseClass,
|
|
209
|
+
children: [saving && t('general:saving'), !saving && Boolean(lastSaved) && /*#__PURE__*/_jsx(React.Fragment, {
|
|
210
|
+
children: t('version:lastSavedAgo', {
|
|
211
|
+
distance: formatTimeToNow({
|
|
212
|
+
date: lastSaved,
|
|
213
|
+
i18n
|
|
288
214
|
})
|
|
289
|
-
})
|
|
290
|
-
})
|
|
291
|
-
|
|
292
|
-
$[40] = lastSaved;
|
|
293
|
-
$[41] = i18n;
|
|
294
|
-
$[42] = t;
|
|
295
|
-
$[43] = t8;
|
|
296
|
-
$[44] = t9;
|
|
297
|
-
} else {
|
|
298
|
-
t9 = $[44];
|
|
299
|
-
}
|
|
300
|
-
return t9;
|
|
215
|
+
})
|
|
216
|
+
})]
|
|
217
|
+
});
|
|
301
218
|
};
|
|
302
219
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["c","_c","versionDefaults","React","useEffect","useRef","useState","toast","useAllFormFields","useForm","useFormModified","useFormSubmitted","useDebounce","useConfig","useDocumentEvents","useDocumentInfo","useLocale","useTranslation","formatTimeToNow","reduceFieldsToValuesWithValidation","baseClass","minimumAnimationTime","Autosave","t0","$","id","collection","global","globalDoc","publishedDocUpdatedAt","config","t1","routes","t2","serverURL","api","docConfig","getVersions","versions","reportUpdate","dispatchFields","setModified","setSubmitted","submitted","versionsConfig","fields","formModified","code","locale","i18n","t","interval","autosaveInterval","drafts","autosave","saving","setSaving","lastSaved","setLastSaved","debouncedFields","modified","fieldRef","modifiedRef","localeRef","debouncedRef","current","t3","abortController","AbortController","autosaveTimeout","undefined","startTimestamp","endTimestamp","url","method","entitySlug","slug","data","valid","_status","skipSubmission","validate","fetch","body","JSON","stringify","credentials","headers","language","signal","then","res","newDate","Date","getTime","status","updatedAt","toISOString","json","errors","Array","isArray","fieldErrors","nonFieldErrors","reduce","t4","err","fieldErrs","nonFieldErrs","newFieldErrs","newNonFieldErrs","message","push","forEach","dataError","field","type","err_0","error","clearTimeout","abort","t5","t6","t7","docs","t8","t9","_jsxs","className","children","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 { 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 { formatTimeToNow } from '../../utilities/formatDate.js'\nimport { reduceFieldsToValuesWithValidation } from '../../utilities/reduceFieldsToValuesWithValidation.js'\nimport './index.scss'\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> = ({\n id,\n collection,\n global: globalDoc,\n publishedDocUpdatedAt,\n}) => {\n const {\n config: {\n routes: { api },\n serverURL,\n },\n } = useConfig()\n const { docConfig, getVersions, versions } = useDocumentInfo()\n const { reportUpdate } = useDocumentEvents()\n const { dispatchFields, setModified, setSubmitted } = useForm()\n const submitted = useFormSubmitted()\n const versionsConfig = docConfig?.versions\n\n const [fields] = useAllFormFields()\n const formModified = 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 const [saving, setSaving] = useState(false)\n const [lastSaved, setLastSaved] = useState<number>()\n const debouncedFields = useDebounce(fields, interval)\n const modified = useDebounce(formModified, 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 // When debounced fields change, autosave\n useEffect(() => {\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 = () => {\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 void 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 setLastSaved(newDate.getTime())\n\n reportUpdate({\n id,\n entitySlug,\n updatedAt: newDate.toISOString(),\n })\n setModified(false)\n void getVersions()\n } else {\n return res.json()\n }\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 }\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 void autosave()\n\n return () => {\n if (autosaveTimeout) clearTimeout(autosaveTimeout)\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 }, [\n api,\n collection,\n dispatchFields,\n getVersions,\n globalDoc,\n i18n,\n id,\n interval,\n modified,\n reportUpdate,\n serverURL,\n setSubmitted,\n setModified,\n versionsConfig?.drafts,\n debouncedFields,\n submitted,\n ])\n\n useEffect(() => {\n if (versions?.docs?.[0]) {\n setLastSaved(new Date(versions.docs[0].updatedAt).getTime())\n } else if (publishedDocUpdatedAt) {\n setLastSaved(new Date(publishedDocUpdatedAt).getTime())\n }\n }, [publishedDocUpdatedAt, versions])\n\n return (\n <div className={baseClass}>\n {saving && t('general:saving')}\n {!saving && Boolean(lastSaved) && (\n <React.Fragment>\n {t('version:lastSavedAgo', {\n distance: formatTimeToNow({ date: lastSaved, i18n }),\n })}\n </React.Fragment>\n )}\n </div>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["versionDefaults","React","useEffect","useRef","useState","toast","useAllFormFields","useForm","useFormModified","useFormSubmitted","useDebounce","useConfig","useDocumentEvents","useDocumentInfo","useLocale","useTranslation","formatTimeToNow","reduceFieldsToValuesWithValidation","baseClass","minimumAnimationTime","Autosave","id","collection","global","globalDoc","publishedDocUpdatedAt","config","routes","api","serverURL","docConfig","getVersions","versions","reportUpdate","dispatchFields","setModified","setSubmitted","submitted","versionsConfig","fields","formModified","code","locale","i18n","t","interval","autosaveInterval","drafts","autosave","saving","setSaving","lastSaved","setLastSaved","debouncedFields","modified","fieldRef","modifiedRef","localeRef","debouncedRef","current","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","json","errors","Array","isArray","fieldErrors","nonFieldErrors","reduce","fieldErrs","nonFieldErrs","err","newFieldErrs","newNonFieldErrs","message","push","forEach","dataError","field","type","error","setTimeout","clearTimeout","abort","docs","_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 { 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 { formatTimeToNow } from '../../utilities/formatDate.js'\nimport { reduceFieldsToValuesWithValidation } from '../../utilities/reduceFieldsToValuesWithValidation.js'\nimport './index.scss'\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> = ({\n id,\n collection,\n global: globalDoc,\n publishedDocUpdatedAt,\n}) => {\n const {\n config: {\n routes: { api },\n serverURL,\n },\n } = useConfig()\n const { docConfig, getVersions, versions } = useDocumentInfo()\n const { reportUpdate } = useDocumentEvents()\n const { dispatchFields, setModified, setSubmitted } = useForm()\n const submitted = useFormSubmitted()\n const versionsConfig = docConfig?.versions\n\n const [fields] = useAllFormFields()\n const formModified = 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 const [saving, setSaving] = useState(false)\n const [lastSaved, setLastSaved] = useState<number>()\n const debouncedFields = useDebounce(fields, interval)\n const modified = useDebounce(formModified, 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 // When debounced fields change, autosave\n useEffect(() => {\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 = () => {\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 void 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 setLastSaved(newDate.getTime())\n\n reportUpdate({\n id,\n entitySlug,\n updatedAt: newDate.toISOString(),\n })\n setModified(false)\n void getVersions()\n } else {\n return res.json()\n }\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 }\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 void autosave()\n\n return () => {\n if (autosaveTimeout) clearTimeout(autosaveTimeout)\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 }, [\n api,\n collection,\n dispatchFields,\n getVersions,\n globalDoc,\n i18n,\n id,\n interval,\n modified,\n reportUpdate,\n serverURL,\n setSubmitted,\n setModified,\n versionsConfig?.drafts,\n debouncedFields,\n submitted,\n ])\n\n useEffect(() => {\n if (versions?.docs?.[0]) {\n setLastSaved(new Date(versions.docs[0].updatedAt).getTime())\n } else if (publishedDocUpdatedAt) {\n setLastSaved(new Date(publishedDocUpdatedAt).getTime())\n }\n }, [publishedDocUpdatedAt, versions])\n\n return (\n <div className={baseClass}>\n {saving && t('general:saving')}\n {!saving && Boolean(lastSaved) && (\n <React.Fragment>\n {t('version:lastSavedAgo', {\n distance: formatTimeToNow({ date: lastSaved, i18n }),\n })}\n </React.Fragment>\n )}\n </div>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|