@payloadcms/ui 3.89.0 → 3.90.1

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 (82) hide show
  1. package/dist/elements/BulkUpload/FormsManager/createFormData.d.ts +1 -1
  2. package/dist/elements/BulkUpload/FormsManager/createFormData.d.ts.map +1 -1
  3. package/dist/elements/BulkUpload/FormsManager/createFormData.js +7 -3
  4. package/dist/elements/BulkUpload/FormsManager/createFormData.js.map +1 -1
  5. package/dist/elements/BulkUpload/FormsManager/index.d.ts.map +1 -1
  6. package/dist/elements/BulkUpload/FormsManager/index.js +4 -2
  7. package/dist/elements/BulkUpload/FormsManager/index.js.map +1 -1
  8. package/dist/elements/Spinner/index.d.ts +19 -0
  9. package/dist/elements/Spinner/index.d.ts.map +1 -0
  10. package/dist/elements/Spinner/index.js +51 -0
  11. package/dist/elements/Spinner/index.js.map +1 -0
  12. package/dist/elements/Spinner/index.scss +23 -0
  13. package/dist/exports/client/index.d.ts +4 -1
  14. package/dist/exports/client/index.d.ts.map +1 -1
  15. package/dist/exports/client/index.js +12 -12
  16. package/dist/exports/client/index.js.map +4 -4
  17. package/dist/fields/Tabs/index.d.ts.map +1 -1
  18. package/dist/fields/Tabs/index.js +109 -234
  19. package/dist/fields/Tabs/index.js.map +1 -1
  20. package/dist/fields/Tabs/resolveRestoredTabIndex.d.ts +19 -0
  21. package/dist/fields/Tabs/resolveRestoredTabIndex.d.ts.map +1 -0
  22. package/dist/fields/Tabs/resolveRestoredTabIndex.js +20 -0
  23. package/dist/fields/Tabs/resolveRestoredTabIndex.js.map +1 -0
  24. package/dist/fields/Tabs/resolveRestoredTabIndex.spec.js +53 -0
  25. package/dist/fields/Tabs/resolveRestoredTabIndex.spec.js.map +1 -0
  26. package/dist/forms/Form/index.d.ts.map +1 -1
  27. package/dist/forms/Form/index.js +6 -2
  28. package/dist/forms/Form/index.js.map +1 -1
  29. package/dist/forms/fieldSchemasToFormState/renderField.d.ts.map +1 -1
  30. package/dist/forms/fieldSchemasToFormState/renderField.js +3 -2
  31. package/dist/forms/fieldSchemasToFormState/renderField.js.map +1 -1
  32. package/dist/forms/fieldSchemasToFormState/serverFunctions/mergeAllowedFieldOverrides.d.ts +12 -0
  33. package/dist/forms/fieldSchemasToFormState/serverFunctions/mergeAllowedFieldOverrides.d.ts.map +1 -0
  34. package/dist/forms/fieldSchemasToFormState/serverFunctions/mergeAllowedFieldOverrides.js +32 -0
  35. package/dist/forms/fieldSchemasToFormState/serverFunctions/mergeAllowedFieldOverrides.js.map +1 -0
  36. package/dist/forms/fieldSchemasToFormState/serverFunctions/renderFieldServerFn.d.ts +8 -6
  37. package/dist/forms/fieldSchemasToFormState/serverFunctions/renderFieldServerFn.d.ts.map +1 -1
  38. package/dist/forms/fieldSchemasToFormState/serverFunctions/renderFieldServerFn.js +25 -9
  39. package/dist/forms/fieldSchemasToFormState/serverFunctions/renderFieldServerFn.js.map +1 -1
  40. package/dist/forms/fieldSchemasToFormState/serverFunctions/renderFieldServerFn.spec.js +179 -0
  41. package/dist/forms/fieldSchemasToFormState/serverFunctions/renderFieldServerFn.spec.js.map +1 -0
  42. package/dist/forms/fieldSchemasToFormState/types.d.ts +1 -0
  43. package/dist/forms/fieldSchemasToFormState/types.d.ts.map +1 -1
  44. package/dist/forms/fieldSchemasToFormState/types.js.map +1 -1
  45. package/dist/icons/Eye/index.scss +1 -1
  46. package/dist/icons/Refresh/index.d.ts +7 -0
  47. package/dist/icons/Refresh/index.d.ts.map +1 -0
  48. package/dist/icons/Refresh/index.js +35 -0
  49. package/dist/icons/Refresh/index.js.map +1 -0
  50. package/dist/icons/Refresh/index.scss +11 -0
  51. package/dist/icons/Spinner/index.d.ts +8 -0
  52. package/dist/icons/Spinner/index.d.ts.map +1 -0
  53. package/dist/icons/Spinner/index.js +34 -0
  54. package/dist/icons/Spinner/index.js.map +1 -0
  55. package/dist/icons/Spinner/index.scss +12 -0
  56. package/dist/styles.css +1 -1
  57. package/dist/utilities/buildFormState.d.ts.map +1 -1
  58. package/dist/utilities/buildFormState.js +6 -2
  59. package/dist/utilities/buildFormState.js.map +1 -1
  60. package/dist/utilities/schedulePublishHandler.d.ts.map +1 -1
  61. package/dist/utilities/schedulePublishHandler.js +4 -1
  62. package/dist/utilities/schedulePublishHandler.js.map +1 -1
  63. package/dist/views/Edit/Auth/APIKey.d.ts +1 -1
  64. package/dist/views/Edit/Auth/APIKey.d.ts.map +1 -1
  65. package/dist/views/Edit/Auth/APIKey.js +216 -59
  66. package/dist/views/Edit/Auth/APIKey.js.map +1 -1
  67. package/dist/views/Edit/Auth/APIKeyGenerationModal.d.ts +11 -0
  68. package/dist/views/Edit/Auth/APIKeyGenerationModal.d.ts.map +1 -0
  69. package/dist/views/Edit/Auth/APIKeyGenerationModal.js +113 -0
  70. package/dist/views/Edit/Auth/APIKeyGenerationModal.js.map +1 -0
  71. package/dist/views/Edit/Auth/index.d.ts.map +1 -1
  72. package/dist/views/Edit/Auth/index.js +10 -30
  73. package/dist/views/Edit/Auth/index.js.map +1 -1
  74. package/dist/views/Edit/Auth/index.scss +73 -36
  75. package/dist/views/Edit/Auth/types.d.ts +1 -1
  76. package/dist/views/Edit/Auth/types.d.ts.map +1 -1
  77. package/dist/views/Edit/Auth/types.js.map +1 -1
  78. package/package.json +5 -5
  79. package/dist/elements/GenerateConfirmation/index.d.ts +0 -7
  80. package/dist/elements/GenerateConfirmation/index.d.ts.map +0 -1
  81. package/dist/elements/GenerateConfirmation/index.js +0 -95
  82. package/dist/elements/GenerateConfirmation/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fields/Tabs/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,oBAAoB,EAMrB,MAAM,SAAS,CAAA;AAIhB,OAAO,KAA2C,MAAM,OAAO,CAAA;AAa/D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAE5C,OAAO,cAAc,CAAA;AAIrB,OAAO,EAAE,YAAY,EAAE,CAAA;AAsKvB,eAAO,MAAM,SAAS;;6DAAoC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fields/Tabs/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,oBAAoB,EAMrB,MAAM,SAAS,CAAA;AAIhB,OAAO,KAAmD,MAAM,OAAO,CAAA;AAavE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAG5C,OAAO,cAAc,CAAA;AAIrB,OAAO,EAAE,YAAY,EAAE,CAAA;AA+LvB,eAAO,MAAM,SAAS;;6DAAoC,CAAA"}
@@ -4,7 +4,7 @@ import { c as _c } from "react/compiler-runtime";
4
4
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
5
5
  import { getTranslation } from '@payloadcms/translations';
6
6
  import { getFieldPaths, toKebabCase } from 'payload/shared';
7
- import React, { useCallback, useEffect, useState } from 'react';
7
+ import React, { useCallback, useEffect, useRef, useState } from 'react';
8
8
  import { useCollapsible } from '../../elements/Collapsible/provider.js';
9
9
  import { RenderCustomComponent } from '../../elements/RenderCustomComponent/index.js';
10
10
  import { useFormFields } from '../../forms/Form/index.js';
@@ -17,53 +17,28 @@ import { useTranslation } from '../../providers/Translation/index.js';
17
17
  import { FieldDescription } from '../FieldDescription/index.js';
18
18
  import { fieldBaseClass } from '../shared/index.js';
19
19
  import { TabsProvider } from './provider.js';
20
+ import { resolveRestoredTabIndex } from './resolveRestoredTabIndex.js';
20
21
  import { TabComponent } from './Tab/index.js';
21
22
  import './index.scss';
22
23
  const baseClass = 'tabs-field';
23
24
  export { TabsProvider };
24
25
  const TabsFieldComponent = props => {
25
- const $ = _c(44);
26
26
  const {
27
- field: t0,
28
- forceRender: t1,
29
- indexPath: t2,
30
- parentPath: t3,
31
- parentSchemaPath: t4,
32
- path: t5,
27
+ field: {
28
+ admin: {
29
+ className
30
+ } = {},
31
+ tabs = []
32
+ },
33
+ forceRender = false,
34
+ indexPath = '',
35
+ parentPath = '',
36
+ parentSchemaPath = '',
37
+ path = '',
33
38
  permissions,
34
39
  readOnly,
35
- schemaPath: t6
40
+ schemaPath = ''
36
41
  } = props;
37
- const {
38
- admin: t7,
39
- tabs: t8
40
- } = t0;
41
- let t9;
42
- if ($[0] !== t7) {
43
- t9 = t7 === undefined ? {} : t7;
44
- $[0] = t7;
45
- $[1] = t9;
46
- } else {
47
- t9 = $[1];
48
- }
49
- const {
50
- className
51
- } = t9;
52
- let t10;
53
- if ($[2] !== t8) {
54
- t10 = t8 === undefined ? [] : t8;
55
- $[2] = t8;
56
- $[3] = t10;
57
- } else {
58
- t10 = $[3];
59
- }
60
- const tabs = t10;
61
- const forceRender = t1 === undefined ? false : t1;
62
- const indexPath = t2 === undefined ? "" : t2;
63
- const parentPath = t3 === undefined ? "" : t3;
64
- const parentSchemaPath = t4 === undefined ? "" : t4;
65
- const path = t5 === undefined ? "" : t5;
66
- const schemaPath = t6 === undefined ? "" : t6;
67
42
  const {
68
43
  getPreference,
69
44
  setPreference
@@ -77,205 +52,123 @@ const TabsFieldComponent = props => {
77
52
  const {
78
53
  isWithinCollapsible
79
54
  } = useCollapsible();
80
- let t11;
81
- if ($[4] !== tabs) {
82
- t11 = t12 => {
83
- const [fields] = t12;
84
- return tabs.map((tab, index) => {
85
- const id = tab?.id;
86
- return {
87
- index,
88
- passesCondition: fields?.[id]?.passesCondition ?? true,
89
- tab
90
- };
91
- });
92
- };
93
- $[4] = tabs;
94
- $[5] = t11;
95
- } else {
96
- t11 = $[5];
97
- }
98
- const tabStates = useFormFields(t11);
99
- let t12;
100
- if ($[6] !== tabStates) {
101
- t12 = () => tabStates.filter(_temp)?.[0]?.index ?? 0;
102
- $[6] = tabStates;
103
- $[7] = t12;
104
- } else {
105
- t12 = $[7];
106
- }
107
- const [activeTabIndex, setActiveTabIndex] = useState(t12);
55
+ const tabStates = useFormFields(([fields]) => {
56
+ return tabs.map((tab, index) => {
57
+ const id = tab?.id;
58
+ return {
59
+ index,
60
+ passesCondition: fields?.[id]?.passesCondition ?? true,
61
+ tab
62
+ };
63
+ });
64
+ });
65
+ const [activeTabIndex, setActiveTabIndex] = useState(() => tabStates.filter(({
66
+ passesCondition
67
+ }) => passesCondition)?.[0]?.index ?? 0);
68
+ const hasUserSelectedTab = useRef(false);
108
69
  const tabsPrefKey = `tabs-${indexPath}`;
109
70
  const activeTabInfo = tabStates[activeTabIndex];
110
71
  const activeTabConfig = activeTabInfo?.tab;
111
72
  const activeTabDescription = activeTabConfig?.admin?.description ?? activeTabConfig?.description;
112
- const activeTabStaticDescription = typeof activeTabDescription === "function" ? activeTabDescription({
73
+ const activeTabStaticDescription = typeof activeTabDescription === 'function' ? activeTabDescription({
113
74
  i18n,
114
75
  t: i18n.t
115
76
  }) : activeTabDescription;
116
- const hasVisibleTabs = tabStates.some(_temp2);
117
- let t13;
118
- if ($[8] !== getPreference || $[9] !== path || $[10] !== preferencesKey || $[11] !== setPreference || $[12] !== tabsPrefKey) {
119
- t13 = async incomingTabIndex => {
120
- setActiveTabIndex(incomingTabIndex);
121
- const existingPreferences = await getPreference(preferencesKey);
122
- if (preferencesKey) {
123
- setPreference(preferencesKey, {
124
- ...existingPreferences,
125
- ...(path ? {
126
- fields: {
127
- ...(existingPreferences?.fields || {}),
128
- [path]: {
129
- ...existingPreferences?.fields?.[path],
130
- tabIndex: incomingTabIndex
131
- }
77
+ const hasVisibleTabs = tabStates.some(({
78
+ passesCondition: passesCondition_0
79
+ }) => passesCondition_0);
80
+ const handleTabChange = useCallback(async incomingTabIndex => {
81
+ setActiveTabIndex(incomingTabIndex);
82
+ const existingPreferences = await getPreference(preferencesKey);
83
+ if (preferencesKey) {
84
+ void setPreference(preferencesKey, {
85
+ ...existingPreferences,
86
+ ...(path ? {
87
+ fields: {
88
+ ...(existingPreferences?.fields || {}),
89
+ [path]: {
90
+ ...existingPreferences?.fields?.[path],
91
+ tabIndex: incomingTabIndex
132
92
  }
133
- } : {
134
- fields: {
135
- ...existingPreferences?.fields,
136
- [tabsPrefKey]: {
137
- ...existingPreferences?.fields?.[tabsPrefKey],
138
- tabIndex: incomingTabIndex
139
- }
93
+ }
94
+ } : {
95
+ fields: {
96
+ ...existingPreferences?.fields,
97
+ [tabsPrefKey]: {
98
+ ...existingPreferences?.fields?.[tabsPrefKey],
99
+ tabIndex: incomingTabIndex
140
100
  }
141
- })
101
+ }
102
+ })
103
+ });
104
+ }
105
+ }, [getPreference, preferencesKey, setPreference, path, tabsPrefKey]);
106
+ useEffect(() => {
107
+ if (preferencesKey) {
108
+ const restoreTabFromPreferences = async () => {
109
+ const existingPreferences_0 = await getPreference(preferencesKey);
110
+ // A tab selected while this read was in flight wins. Restoring afterwards
111
+ // would move the user off the tab they just opened
112
+ if (hasUserSelectedTab.current) {
113
+ return;
114
+ }
115
+ const storedTabIndex = path ? existingPreferences_0?.fields?.[path]?.tabIndex : existingPreferences_0?.fields?.[tabsPrefKey]?.tabIndex;
116
+ const restoredTabIndex = resolveRestoredTabIndex({
117
+ storedTabIndex,
118
+ tabCount: tabStates.length
142
119
  });
143
- }
144
- };
145
- $[8] = getPreference;
146
- $[9] = path;
147
- $[10] = preferencesKey;
148
- $[11] = setPreference;
149
- $[12] = tabsPrefKey;
150
- $[13] = t13;
151
- } else {
152
- t13 = $[13];
153
- }
154
- const handleTabChange = t13;
155
- let t14;
156
- if ($[14] !== getPreference || $[15] !== path || $[16] !== preferencesKey || $[17] !== tabStates.length || $[18] !== tabsPrefKey) {
157
- t14 = () => {
158
- if (preferencesKey) {
159
- const getInitialPref = async () => {
160
- const existingPreferences_0 = await getPreference(preferencesKey);
161
- const initialIndex = path ? existingPreferences_0?.fields?.[path]?.tabIndex : existingPreferences_0?.fields?.[tabsPrefKey]?.tabIndex;
162
- const newIndex = typeof initialIndex === "number" && initialIndex < tabStates.length ? initialIndex : 0;
163
- setActiveTabIndex(newIndex);
164
- };
165
- getInitialPref();
166
- }
167
- };
168
- $[14] = getPreference;
169
- $[15] = path;
170
- $[16] = preferencesKey;
171
- $[17] = tabStates.length;
172
- $[18] = tabsPrefKey;
173
- $[19] = t14;
174
- } else {
175
- t14 = $[19];
176
- }
177
- let t15;
178
- if ($[20] !== getPreference || $[21] !== parentPath || $[22] !== parentSchemaPath || $[23] !== path || $[24] !== preferencesKey || $[25] !== tabs || $[26] !== tabsPrefKey) {
179
- t15 = [path, getPreference, preferencesKey, tabsPrefKey, tabs, parentPath, parentSchemaPath];
180
- $[20] = getPreference;
181
- $[21] = parentPath;
182
- $[22] = parentSchemaPath;
183
- $[23] = path;
184
- $[24] = preferencesKey;
185
- $[25] = tabs;
186
- $[26] = tabsPrefKey;
187
- $[27] = t15;
188
- } else {
189
- t15 = $[27];
190
- }
191
- useEffect(t14, t15);
192
- let t16;
193
- if ($[28] !== activeTabInfo?.passesCondition || $[29] !== handleTabChange || $[30] !== tabStates) {
194
- t16 = () => {
195
- if (activeTabInfo?.passesCondition === false) {
196
- const nextTab = tabStates.find(_temp3);
197
- if (nextTab) {
198
- handleTabChange(nextTab.index);
120
+ if (typeof restoredTabIndex === 'number') {
121
+ setActiveTabIndex(restoredTabIndex);
199
122
  }
123
+ };
124
+ void restoreTabFromPreferences();
125
+ }
126
+ }, [path, getPreference, preferencesKey, tabsPrefKey, tabs, tabStates.length, parentPath, parentSchemaPath]);
127
+ useEffect(() => {
128
+ if (activeTabInfo?.passesCondition === false) {
129
+ const nextTab = tabStates.find(({
130
+ passesCondition: passesCondition_1
131
+ }) => passesCondition_1);
132
+ if (nextTab) {
133
+ void handleTabChange(nextTab.index);
200
134
  }
201
- };
202
- $[28] = activeTabInfo?.passesCondition;
203
- $[29] = handleTabChange;
204
- $[30] = tabStates;
205
- $[31] = t16;
206
- } else {
207
- t16 = $[31];
208
- }
209
- let t17;
210
- if ($[32] !== activeTabInfo || $[33] !== handleTabChange || $[34] !== tabStates) {
211
- t17 = [activeTabInfo, tabStates, handleTabChange];
212
- $[32] = activeTabInfo;
213
- $[33] = handleTabChange;
214
- $[34] = tabStates;
215
- $[35] = t17;
216
- } else {
217
- t17 = $[35];
218
- }
219
- useEffect(t16, t17);
220
- const t18 = isWithinCollapsible && `${baseClass}--within-collapsible`;
221
- const t19 = !hasVisibleTabs && `${baseClass}--hidden`;
222
- let t20;
223
- if ($[36] !== className || $[37] !== t18 || $[38] !== t19) {
224
- t20 = [fieldBaseClass, className, baseClass, t18, t19].filter(Boolean);
225
- $[36] = className;
226
- $[37] = t18;
227
- $[38] = t19;
228
- $[39] = t20;
229
- } else {
230
- t20 = $[39];
231
- }
232
- let t21;
233
- if ($[40] !== activeTabIndex || $[41] !== handleTabChange || $[42] !== path) {
234
- t21 = t22 => {
235
- const {
236
- index: index_0,
237
- passesCondition: passesCondition_2,
238
- tab: tab_0
239
- } = t22;
240
- return _jsx(TabComponent, {
241
- hidden: !passesCondition_2,
242
- isActive: activeTabIndex === index_0,
243
- parentPath: path,
244
- setIsActive: () => {
245
- handleTabChange(index_0);
246
- },
247
- tab: tab_0
248
- }, index_0);
249
- };
250
- $[40] = activeTabIndex;
251
- $[41] = handleTabChange;
252
- $[42] = path;
253
- $[43] = t21;
254
- } else {
255
- t21 = $[43];
256
- }
257
- return _jsx("div", {
258
- className: t20.join(" "),
259
- children: _jsxs(TabsProvider, {
260
- children: [_jsx("div", {
135
+ }
136
+ }, [activeTabInfo, tabStates, handleTabChange]);
137
+ return /*#__PURE__*/_jsx("div", {
138
+ className: [fieldBaseClass, className, baseClass, isWithinCollapsible && `${baseClass}--within-collapsible`, !hasVisibleTabs && `${baseClass}--hidden`].filter(Boolean).join(' '),
139
+ children: /*#__PURE__*/_jsxs(TabsProvider, {
140
+ children: [/*#__PURE__*/_jsx("div", {
261
141
  className: `${baseClass}__tabs-wrap`,
262
- children: _jsx("div", {
142
+ children: /*#__PURE__*/_jsx("div", {
263
143
  className: `${baseClass}__tabs`,
264
- children: tabStates.map(t21)
144
+ children: tabStates.map(({
145
+ index: index_0,
146
+ passesCondition: passesCondition_2,
147
+ tab: tab_0
148
+ }) => /*#__PURE__*/_jsx(TabComponent, {
149
+ hidden: !passesCondition_2,
150
+ isActive: activeTabIndex === index_0,
151
+ parentPath: path,
152
+ setIsActive: () => {
153
+ hasUserSelectedTab.current = true;
154
+ void handleTabChange(index_0);
155
+ },
156
+ tab: tab_0
157
+ }, index_0))
265
158
  })
266
- }), _jsx("div", {
159
+ }), /*#__PURE__*/_jsx("div", {
267
160
  className: `${baseClass}__content-wrap`,
268
- children: activeTabConfig && _jsx(TabContent, {
161
+ children: activeTabConfig && /*#__PURE__*/_jsx(TabContent, {
269
162
  description: activeTabStaticDescription,
270
163
  field: activeTabConfig,
271
- forceRender,
164
+ forceRender: forceRender,
272
165
  hidden: false,
273
166
  parentIndexPath: indexPath,
274
167
  parentPath: path,
275
168
  parentSchemaPath: schemaPath,
276
- path,
277
- permissions: permissions && typeof permissions === "object" && "name" in activeTabConfig ? permissions[activeTabConfig.name] && typeof permissions[activeTabConfig.name] === "object" && "fields" in permissions[activeTabConfig.name] ? permissions[activeTabConfig.name].fields : permissions[activeTabConfig.name] : permissions,
278
- readOnly,
169
+ path: path,
170
+ permissions: permissions && typeof permissions === 'object' && 'name' in activeTabConfig ? permissions[activeTabConfig.name] && typeof permissions[activeTabConfig.name] === 'object' && 'fields' in permissions[activeTabConfig.name] ? permissions[activeTabConfig.name].fields : permissions[activeTabConfig.name] : permissions,
171
+ readOnly: readOnly,
279
172
  tabIndex: activeTabIndex
280
173
  })
281
174
  })]
@@ -393,22 +286,4 @@ function TabContent(t0) {
393
286
  }
394
287
  return t2;
395
288
  }
396
- function _temp(t0) {
397
- const {
398
- passesCondition
399
- } = t0;
400
- return passesCondition;
401
- }
402
- function _temp2(t0) {
403
- const {
404
- passesCondition: passesCondition_0
405
- } = t0;
406
- return passesCondition_0;
407
- }
408
- function _temp3(t0) {
409
- const {
410
- passesCondition: passesCondition_1
411
- } = t0;
412
- return passesCondition_1;
413
- }
414
289
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["c","_c","getTranslation","getFieldPaths","toKebabCase","React","useCallback","useEffect","useState","useCollapsible","RenderCustomComponent","useFormFields","RenderFields","useField","withCondition","useDocumentInfo","usePreferences","useTranslation","FieldDescription","fieldBaseClass","TabsProvider","TabComponent","baseClass","TabsFieldComponent","props","$","field","t0","forceRender","t1","indexPath","t2","parentPath","t3","parentSchemaPath","t4","path","t5","permissions","readOnly","schemaPath","t6","admin","t7","tabs","t8","t9","undefined","className","t10","getPreference","setPreference","preferencesKey","i18n","isWithinCollapsible","t11","t12","fields","map","tab","index","id","passesCondition","tabStates","filter","_temp","activeTabIndex","setActiveTabIndex","tabsPrefKey","activeTabInfo","activeTabConfig","activeTabDescription","description","activeTabStaticDescription","t","hasVisibleTabs","some","_temp2","t13","incomingTabIndex","existingPreferences","tabIndex","handleTabChange","t14","length","getInitialPref","existingPreferences_0","initialIndex","newIndex","t15","t16","nextTab","find","_temp3","t17","t18","t19","t20","Boolean","t21","t22","index_0","passesCondition_2","tab_0","_jsx","hidden","isActive","setIsActive","join","children","_jsxs","TabContent","parentIndexPath","name","TabsField","label","customComponents","Field","bb0","AfterInput","BeforeInput","Description","CustomComponent","Fallback","marginPlacement","passesCondition_0","passesCondition_1"],"sources":["../../../src/fields/Tabs/index.tsx"],"sourcesContent":["'use client'\nimport type {\n ClientComponentProps,\n ClientTab,\n DocumentPreferences,\n SanitizedFieldPermissions,\n StaticDescription,\n TabsFieldClientComponent,\n} from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { getFieldPaths, toKebabCase } from 'payload/shared'\nimport React, { useCallback, useEffect, useState } from 'react'\n\nimport { useCollapsible } from '../../elements/Collapsible/provider.js'\nimport { RenderCustomComponent } from '../../elements/RenderCustomComponent/index.js'\nimport { useFormFields } from '../../forms/Form/index.js'\nimport { RenderFields } from '../../forms/RenderFields/index.js'\nimport { useField } from '../../forms/useField/index.js'\nimport { withCondition } from '../../forms/withCondition/index.js'\nimport { useDocumentInfo } from '../../providers/DocumentInfo/index.js'\nimport { usePreferences } from '../../providers/Preferences/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { FieldDescription } from '../FieldDescription/index.js'\nimport { fieldBaseClass } from '../shared/index.js'\nimport { TabsProvider } from './provider.js'\nimport { TabComponent } from './Tab/index.js'\nimport './index.scss'\n\nconst baseClass = 'tabs-field'\n\nexport { TabsProvider }\n\nconst TabsFieldComponent: TabsFieldClientComponent = (props) => {\n const {\n field: { admin: { className } = {}, tabs = [] },\n forceRender = false,\n indexPath = '',\n parentPath = '',\n parentSchemaPath = '',\n path = '',\n permissions,\n readOnly,\n schemaPath = '',\n } = props\n\n const { getPreference, setPreference } = usePreferences()\n const { preferencesKey } = useDocumentInfo()\n const { i18n } = useTranslation()\n const { isWithinCollapsible } = useCollapsible()\n\n const tabStates = useFormFields(([fields]) => {\n return tabs.map((tab, index) => {\n const id = tab?.id\n\n return {\n index,\n passesCondition: fields?.[id]?.passesCondition ?? true,\n tab,\n }\n })\n })\n\n const [activeTabIndex, setActiveTabIndex] = useState<number>(\n () => tabStates.filter(({ passesCondition }) => passesCondition)?.[0]?.index ?? 0,\n )\n\n const tabsPrefKey = `tabs-${indexPath}`\n\n const activeTabInfo = tabStates[activeTabIndex]\n const activeTabConfig = activeTabInfo?.tab\n const activeTabDescription = activeTabConfig?.admin?.description ?? activeTabConfig?.description\n\n const activeTabStaticDescription =\n typeof activeTabDescription === 'function'\n ? activeTabDescription({ i18n, t: i18n.t })\n : activeTabDescription\n\n const hasVisibleTabs = tabStates.some(({ passesCondition }) => passesCondition)\n\n const handleTabChange = useCallback(\n async (incomingTabIndex: number): Promise<void> => {\n setActiveTabIndex(incomingTabIndex)\n\n const existingPreferences: DocumentPreferences = await getPreference(preferencesKey)\n\n if (preferencesKey) {\n void setPreference(preferencesKey, {\n ...existingPreferences,\n ...(path\n ? {\n fields: {\n ...(existingPreferences?.fields || {}),\n [path]: {\n ...existingPreferences?.fields?.[path],\n tabIndex: incomingTabIndex,\n },\n },\n }\n : {\n fields: {\n ...existingPreferences?.fields,\n [tabsPrefKey]: {\n ...existingPreferences?.fields?.[tabsPrefKey],\n tabIndex: incomingTabIndex,\n },\n },\n }),\n })\n }\n },\n [getPreference, preferencesKey, setPreference, path, tabsPrefKey],\n )\n\n useEffect(() => {\n if (preferencesKey) {\n const getInitialPref = async () => {\n const existingPreferences: DocumentPreferences = await getPreference(preferencesKey)\n const initialIndex = path\n ? existingPreferences?.fields?.[path]?.tabIndex\n : existingPreferences?.fields?.[tabsPrefKey]?.tabIndex\n\n const newIndex = typeof initialIndex === 'number' && initialIndex < tabStates.length ? initialIndex : 0\n setActiveTabIndex(newIndex)\n }\n void getInitialPref()\n }\n }, [path, getPreference, preferencesKey, tabsPrefKey, tabs, parentPath, parentSchemaPath])\n\n useEffect(() => {\n if (activeTabInfo?.passesCondition === false) {\n const nextTab = tabStates.find(({ passesCondition }) => passesCondition)\n if (nextTab) {\n void handleTabChange(nextTab.index)\n }\n }\n }, [activeTabInfo, tabStates, handleTabChange])\n\n return (\n <div\n className={[\n fieldBaseClass,\n className,\n baseClass,\n isWithinCollapsible && `${baseClass}--within-collapsible`,\n !hasVisibleTabs && `${baseClass}--hidden`,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <TabsProvider>\n <div className={`${baseClass}__tabs-wrap`}>\n <div className={`${baseClass}__tabs`}>\n {tabStates.map(({ index, passesCondition, tab }) => (\n <TabComponent\n hidden={!passesCondition}\n isActive={activeTabIndex === index}\n key={index}\n parentPath={path}\n setIsActive={() => {\n void handleTabChange(index)\n }}\n tab={tab}\n />\n ))}\n </div>\n </div>\n <div className={`${baseClass}__content-wrap`}>\n {activeTabConfig && (\n <TabContent\n description={activeTabStaticDescription}\n field={activeTabConfig}\n forceRender={forceRender}\n hidden={false}\n parentIndexPath={indexPath}\n parentPath={path}\n parentSchemaPath={schemaPath}\n path={path}\n permissions={\n permissions && typeof permissions === 'object' && 'name' in activeTabConfig\n ? permissions[activeTabConfig.name] &&\n typeof permissions[activeTabConfig.name] === 'object' &&\n 'fields' in permissions[activeTabConfig.name]\n ? permissions[activeTabConfig.name].fields\n : permissions[activeTabConfig.name]\n : permissions\n }\n readOnly={readOnly}\n tabIndex={activeTabIndex}\n />\n )}\n </div>\n </TabsProvider>\n </div>\n )\n}\n\nexport const TabsField = withCondition(TabsFieldComponent)\n\ntype ActiveTabProps = {\n readonly description: StaticDescription\n readonly field: ClientTab\n readonly hidden: boolean\n readonly label?: string\n readonly parentIndexPath: string\n readonly parentPath: string\n readonly parentSchemaPath: string\n readonly path: string\n readonly permissions: SanitizedFieldPermissions\n readonly readOnly: boolean\n readonly tabIndex: number\n} & Pick<ClientComponentProps, 'forceRender'>\n\nfunction TabContent({\n description,\n field,\n forceRender,\n hidden,\n label,\n parentIndexPath,\n parentPath,\n parentSchemaPath,\n permissions,\n readOnly,\n tabIndex,\n}: ActiveTabProps) {\n const { i18n } = useTranslation()\n\n const { customComponents: { AfterInput, BeforeInput, Description, Field } = {} } = useField()\n\n if (Field) {\n return Field\n }\n\n const { indexPath, path, schemaPath } = getFieldPaths({\n field,\n index: tabIndex,\n parentIndexPath,\n parentPath,\n parentSchemaPath,\n })\n\n return (\n <div\n className={[\n hidden && `${baseClass}__tab--hidden`,\n `${baseClass}__tab`,\n label && `${baseClass}__tabConfigLabel-${toKebabCase(getTranslation(label, i18n))}`,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <RenderCustomComponent\n CustomComponent={Description}\n Fallback={\n <FieldDescription description={description} marginPlacement=\"bottom\" path={parentPath} />\n }\n />\n {BeforeInput}\n <RenderFields\n fields={field.fields}\n forceRender={forceRender}\n parentIndexPath={indexPath}\n parentPath={path}\n parentSchemaPath={schemaPath}\n permissions={permissions}\n readOnly={readOnly}\n />\n {AfterInput}\n </div>\n )\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["c","_c","getTranslation","getFieldPaths","toKebabCase","React","useCallback","useEffect","useRef","useState","useCollapsible","RenderCustomComponent","useFormFields","RenderFields","useField","withCondition","useDocumentInfo","usePreferences","useTranslation","FieldDescription","fieldBaseClass","TabsProvider","resolveRestoredTabIndex","TabComponent","baseClass","TabsFieldComponent","props","field","admin","className","tabs","forceRender","indexPath","parentPath","parentSchemaPath","path","permissions","readOnly","schemaPath","getPreference","setPreference","preferencesKey","i18n","isWithinCollapsible","tabStates","fields","map","tab","index","id","passesCondition","activeTabIndex","setActiveTabIndex","filter","hasUserSelectedTab","tabsPrefKey","activeTabInfo","activeTabConfig","activeTabDescription","description","activeTabStaticDescription","t","hasVisibleTabs","some","handleTabChange","incomingTabIndex","existingPreferences","tabIndex","restoreTabFromPreferences","current","storedTabIndex","restoredTabIndex","tabCount","length","nextTab","find","_jsx","Boolean","join","_jsxs","hidden","isActive","setIsActive","TabContent","parentIndexPath","name","TabsField","t0","$","label","customComponents","t1","t2","t3","Field","bb0","AfterInput","BeforeInput","Description","undefined","t4","t5","t6","children","CustomComponent","Fallback","marginPlacement"],"sources":["../../../src/fields/Tabs/index.tsx"],"sourcesContent":["'use client'\nimport type {\n ClientComponentProps,\n ClientTab,\n DocumentPreferences,\n SanitizedFieldPermissions,\n StaticDescription,\n TabsFieldClientComponent,\n} from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { getFieldPaths, toKebabCase } from 'payload/shared'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\n\nimport { useCollapsible } from '../../elements/Collapsible/provider.js'\nimport { RenderCustomComponent } from '../../elements/RenderCustomComponent/index.js'\nimport { useFormFields } from '../../forms/Form/index.js'\nimport { RenderFields } from '../../forms/RenderFields/index.js'\nimport { useField } from '../../forms/useField/index.js'\nimport { withCondition } from '../../forms/withCondition/index.js'\nimport { useDocumentInfo } from '../../providers/DocumentInfo/index.js'\nimport { usePreferences } from '../../providers/Preferences/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { FieldDescription } from '../FieldDescription/index.js'\nimport { fieldBaseClass } from '../shared/index.js'\nimport { TabsProvider } from './provider.js'\nimport { resolveRestoredTabIndex } from './resolveRestoredTabIndex.js'\nimport { TabComponent } from './Tab/index.js'\nimport './index.scss'\n\nconst baseClass = 'tabs-field'\n\nexport { TabsProvider }\n\nconst TabsFieldComponent: TabsFieldClientComponent = (props) => {\n const {\n field: { admin: { className } = {}, tabs = [] },\n forceRender = false,\n indexPath = '',\n parentPath = '',\n parentSchemaPath = '',\n path = '',\n permissions,\n readOnly,\n schemaPath = '',\n } = props\n\n const { getPreference, setPreference } = usePreferences()\n const { preferencesKey } = useDocumentInfo()\n const { i18n } = useTranslation()\n const { isWithinCollapsible } = useCollapsible()\n\n const tabStates = useFormFields(([fields]) => {\n return tabs.map((tab, index) => {\n const id = tab?.id\n\n return {\n index,\n passesCondition: fields?.[id]?.passesCondition ?? true,\n tab,\n }\n })\n })\n\n const [activeTabIndex, setActiveTabIndex] = useState<number>(\n () => tabStates.filter(({ passesCondition }) => passesCondition)?.[0]?.index ?? 0,\n )\n\n const hasUserSelectedTab = useRef(false)\n\n const tabsPrefKey = `tabs-${indexPath}`\n\n const activeTabInfo = tabStates[activeTabIndex]\n const activeTabConfig = activeTabInfo?.tab\n const activeTabDescription = activeTabConfig?.admin?.description ?? activeTabConfig?.description\n\n const activeTabStaticDescription =\n typeof activeTabDescription === 'function'\n ? activeTabDescription({ i18n, t: i18n.t })\n : activeTabDescription\n\n const hasVisibleTabs = tabStates.some(({ passesCondition }) => passesCondition)\n\n const handleTabChange = useCallback(\n async (incomingTabIndex: number): Promise<void> => {\n setActiveTabIndex(incomingTabIndex)\n\n const existingPreferences: DocumentPreferences = await getPreference(preferencesKey)\n\n if (preferencesKey) {\n void setPreference(preferencesKey, {\n ...existingPreferences,\n ...(path\n ? {\n fields: {\n ...(existingPreferences?.fields || {}),\n [path]: {\n ...existingPreferences?.fields?.[path],\n tabIndex: incomingTabIndex,\n },\n },\n }\n : {\n fields: {\n ...existingPreferences?.fields,\n [tabsPrefKey]: {\n ...existingPreferences?.fields?.[tabsPrefKey],\n tabIndex: incomingTabIndex,\n },\n },\n }),\n })\n }\n },\n [getPreference, preferencesKey, setPreference, path, tabsPrefKey],\n )\n\n useEffect(() => {\n if (preferencesKey) {\n const restoreTabFromPreferences = async () => {\n const existingPreferences: DocumentPreferences = await getPreference(preferencesKey)\n\n // A tab selected while this read was in flight wins. Restoring afterwards\n // would move the user off the tab they just opened\n if (hasUserSelectedTab.current) {\n return\n }\n\n const storedTabIndex = path\n ? existingPreferences?.fields?.[path]?.tabIndex\n : existingPreferences?.fields?.[tabsPrefKey]?.tabIndex\n\n const restoredTabIndex = resolveRestoredTabIndex({\n storedTabIndex,\n tabCount: tabStates.length,\n })\n\n if (typeof restoredTabIndex === 'number') {\n setActiveTabIndex(restoredTabIndex)\n }\n }\n void restoreTabFromPreferences()\n }\n }, [\n path,\n getPreference,\n preferencesKey,\n tabsPrefKey,\n tabs,\n tabStates.length,\n parentPath,\n parentSchemaPath,\n ])\n\n useEffect(() => {\n if (activeTabInfo?.passesCondition === false) {\n const nextTab = tabStates.find(({ passesCondition }) => passesCondition)\n if (nextTab) {\n void handleTabChange(nextTab.index)\n }\n }\n }, [activeTabInfo, tabStates, handleTabChange])\n\n return (\n <div\n className={[\n fieldBaseClass,\n className,\n baseClass,\n isWithinCollapsible && `${baseClass}--within-collapsible`,\n !hasVisibleTabs && `${baseClass}--hidden`,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <TabsProvider>\n <div className={`${baseClass}__tabs-wrap`}>\n <div className={`${baseClass}__tabs`}>\n {tabStates.map(({ index, passesCondition, tab }) => (\n <TabComponent\n hidden={!passesCondition}\n isActive={activeTabIndex === index}\n key={index}\n parentPath={path}\n setIsActive={() => {\n hasUserSelectedTab.current = true\n void handleTabChange(index)\n }}\n tab={tab}\n />\n ))}\n </div>\n </div>\n <div className={`${baseClass}__content-wrap`}>\n {activeTabConfig && (\n <TabContent\n description={activeTabStaticDescription}\n field={activeTabConfig}\n forceRender={forceRender}\n hidden={false}\n parentIndexPath={indexPath}\n parentPath={path}\n parentSchemaPath={schemaPath}\n path={path}\n permissions={\n permissions && typeof permissions === 'object' && 'name' in activeTabConfig\n ? permissions[activeTabConfig.name] &&\n typeof permissions[activeTabConfig.name] === 'object' &&\n 'fields' in permissions[activeTabConfig.name]\n ? permissions[activeTabConfig.name].fields\n : permissions[activeTabConfig.name]\n : permissions\n }\n readOnly={readOnly}\n tabIndex={activeTabIndex}\n />\n )}\n </div>\n </TabsProvider>\n </div>\n )\n}\n\nexport const TabsField = withCondition(TabsFieldComponent)\n\ntype ActiveTabProps = {\n readonly description: StaticDescription\n readonly field: ClientTab\n readonly hidden: boolean\n readonly label?: string\n readonly parentIndexPath: string\n readonly parentPath: string\n readonly parentSchemaPath: string\n readonly path: string\n readonly permissions: SanitizedFieldPermissions\n readonly readOnly: boolean\n readonly tabIndex: number\n} & Pick<ClientComponentProps, 'forceRender'>\n\nfunction TabContent({\n description,\n field,\n forceRender,\n hidden,\n label,\n parentIndexPath,\n parentPath,\n parentSchemaPath,\n permissions,\n readOnly,\n tabIndex,\n}: ActiveTabProps) {\n const { i18n } = useTranslation()\n\n const { customComponents: { AfterInput, BeforeInput, Description, Field } = {} } = useField()\n\n if (Field) {\n return Field\n }\n\n const { indexPath, path, schemaPath } = getFieldPaths({\n field,\n index: tabIndex,\n parentIndexPath,\n parentPath,\n parentSchemaPath,\n })\n\n return (\n <div\n className={[\n hidden && `${baseClass}__tab--hidden`,\n `${baseClass}__tab`,\n label && `${baseClass}__tabConfigLabel-${toKebabCase(getTranslation(label, i18n))}`,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <RenderCustomComponent\n CustomComponent={Description}\n Fallback={\n <FieldDescription description={description} marginPlacement=\"bottom\" path={parentPath} />\n }\n />\n {BeforeInput}\n <RenderFields\n fields={field.fields}\n forceRender={forceRender}\n parentIndexPath={indexPath}\n parentPath={path}\n parentSchemaPath={schemaPath}\n permissions={permissions}\n readOnly={readOnly}\n />\n {AfterInput}\n </div>\n )\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,19 @@
1
+ type Args = {
2
+ /**
3
+ * The `tabIndex` read back from the document's stored preferences. Untyped
4
+ * because preferences are user data and may hold anything.
5
+ */
6
+ storedTabIndex: unknown;
7
+ tabCount: number;
8
+ };
9
+ /**
10
+ * Resolves which tab a document's stored preferences ask for.
11
+ *
12
+ * Returns `undefined` when there is nothing valid to restore, so the caller
13
+ * leaves the current tab alone rather than falling back to the first tab. A
14
+ * fallback would move the user off a tab they had already selected, because the
15
+ * preference read is asynchronous and can land after the selection.
16
+ */
17
+ export declare const resolveRestoredTabIndex: ({ storedTabIndex, tabCount }: Args) => number | undefined;
18
+ export {};
19
+ //# sourceMappingURL=resolveRestoredTabIndex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveRestoredTabIndex.d.ts","sourceRoot":"","sources":["../../../src/fields/Tabs/resolveRestoredTabIndex.ts"],"names":[],"mappings":"AAAA,KAAK,IAAI,GAAG;IACV;;;OAGG;IACH,cAAc,EAAE,OAAO,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,iCAAkC,IAAI,KAAG,MAAM,GAAG,SAUrF,CAAA"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Resolves which tab a document's stored preferences ask for.
3
+ *
4
+ * Returns `undefined` when there is nothing valid to restore, so the caller
5
+ * leaves the current tab alone rather than falling back to the first tab. A
6
+ * fallback would move the user off a tab they had already selected, because the
7
+ * preference read is asynchronous and can land after the selection.
8
+ */export const resolveRestoredTabIndex = ({
9
+ storedTabIndex,
10
+ tabCount
11
+ }) => {
12
+ if (typeof storedTabIndex !== 'number' || !Number.isInteger(storedTabIndex)) {
13
+ return undefined;
14
+ }
15
+ if (storedTabIndex < 0 || storedTabIndex >= tabCount) {
16
+ return undefined;
17
+ }
18
+ return storedTabIndex;
19
+ };
20
+ //# sourceMappingURL=resolveRestoredTabIndex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveRestoredTabIndex.js","names":["resolveRestoredTabIndex","storedTabIndex","tabCount","Number","isInteger","undefined"],"sources":["../../../src/fields/Tabs/resolveRestoredTabIndex.ts"],"sourcesContent":["type Args = {\n /**\n * The `tabIndex` read back from the document's stored preferences. Untyped\n * because preferences are user data and may hold anything.\n */\n storedTabIndex: unknown\n tabCount: number\n}\n\n/**\n * Resolves which tab a document's stored preferences ask for.\n *\n * Returns `undefined` when there is nothing valid to restore, so the caller\n * leaves the current tab alone rather than falling back to the first tab. A\n * fallback would move the user off a tab they had already selected, because the\n * preference read is asynchronous and can land after the selection.\n */\nexport const resolveRestoredTabIndex = ({ storedTabIndex, tabCount }: Args): number | undefined => {\n if (typeof storedTabIndex !== 'number' || !Number.isInteger(storedTabIndex)) {\n return undefined\n }\n\n if (storedTabIndex < 0 || storedTabIndex >= tabCount) {\n return undefined\n }\n\n return storedTabIndex\n}\n"],"mappings":"AASA;;;;;;;GAQA,OAAO,MAAMA,uBAAA,GAA0BA,CAAC;EAAEC,cAAc;EAAEC;AAAQ,CAAQ;EACxE,IAAI,OAAOD,cAAA,KAAmB,YAAY,CAACE,MAAA,CAAOC,SAAS,CAACH,cAAA,GAAiB;IAC3E,OAAOI,SAAA;EACT;EAEA,IAAIJ,cAAA,GAAiB,KAAKA,cAAA,IAAkBC,QAAA,EAAU;IACpD,OAAOG,SAAA;EACT;EAEA,OAAOJ,cAAA;AACT","ignoreList":[]}
@@ -0,0 +1,53 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { resolveRestoredTabIndex } from './resolveRestoredTabIndex.js';
3
+ describe('resolveRestoredTabIndex', () => {
4
+ it('should restore a stored index that is within range', () => {
5
+ expect(resolveRestoredTabIndex({
6
+ storedTabIndex: 2,
7
+ tabCount: 5
8
+ })).toBe(2);
9
+ });
10
+ it('should restore the first tab when it is the stored index', () => {
11
+ expect(resolveRestoredTabIndex({
12
+ storedTabIndex: 0,
13
+ tabCount: 5
14
+ })).toBe(0);
15
+ });
16
+ it('should restore nothing when no index is stored', () => {
17
+ expect(resolveRestoredTabIndex({
18
+ storedTabIndex: undefined,
19
+ tabCount: 5
20
+ })).toBeUndefined();
21
+ });
22
+ it('should restore nothing when the stored index is null', () => {
23
+ expect(resolveRestoredTabIndex({
24
+ storedTabIndex: null,
25
+ tabCount: 5
26
+ })).toBeUndefined();
27
+ });
28
+ it('should restore nothing when the stored index is not a number', () => {
29
+ expect(resolveRestoredTabIndex({
30
+ storedTabIndex: '2',
31
+ tabCount: 5
32
+ })).toBeUndefined();
33
+ });
34
+ it('should restore nothing when the stored index exceeds the tab count', () => {
35
+ expect(resolveRestoredTabIndex({
36
+ storedTabIndex: 5,
37
+ tabCount: 5
38
+ })).toBeUndefined();
39
+ });
40
+ it('should restore nothing when the stored index is negative', () => {
41
+ expect(resolveRestoredTabIndex({
42
+ storedTabIndex: -1,
43
+ tabCount: 5
44
+ })).toBeUndefined();
45
+ });
46
+ it('should restore nothing when there are no tabs', () => {
47
+ expect(resolveRestoredTabIndex({
48
+ storedTabIndex: 0,
49
+ tabCount: 0
50
+ })).toBeUndefined();
51
+ });
52
+ });
53
+ //# sourceMappingURL=resolveRestoredTabIndex.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveRestoredTabIndex.spec.js","names":["describe","expect","it","resolveRestoredTabIndex","storedTabIndex","tabCount","toBe","undefined","toBeUndefined"],"sources":["../../../src/fields/Tabs/resolveRestoredTabIndex.spec.ts"],"sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { resolveRestoredTabIndex } from './resolveRestoredTabIndex.js'\n\ndescribe('resolveRestoredTabIndex', () => {\n it('should restore a stored index that is within range', () => {\n expect(resolveRestoredTabIndex({ storedTabIndex: 2, tabCount: 5 })).toBe(2)\n })\n\n it('should restore the first tab when it is the stored index', () => {\n expect(resolveRestoredTabIndex({ storedTabIndex: 0, tabCount: 5 })).toBe(0)\n })\n\n it('should restore nothing when no index is stored', () => {\n expect(resolveRestoredTabIndex({ storedTabIndex: undefined, tabCount: 5 })).toBeUndefined()\n })\n\n it('should restore nothing when the stored index is null', () => {\n expect(resolveRestoredTabIndex({ storedTabIndex: null, tabCount: 5 })).toBeUndefined()\n })\n\n it('should restore nothing when the stored index is not a number', () => {\n expect(resolveRestoredTabIndex({ storedTabIndex: '2', tabCount: 5 })).toBeUndefined()\n })\n\n it('should restore nothing when the stored index exceeds the tab count', () => {\n expect(resolveRestoredTabIndex({ storedTabIndex: 5, tabCount: 5 })).toBeUndefined()\n })\n\n it('should restore nothing when the stored index is negative', () => {\n expect(resolveRestoredTabIndex({ storedTabIndex: -1, tabCount: 5 })).toBeUndefined()\n })\n\n it('should restore nothing when there are no tabs', () => {\n expect(resolveRestoredTabIndex({ storedTabIndex: 0, tabCount: 0 })).toBeUndefined()\n })\n})\n"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ;AAErC,SAASC,uBAAuB,QAAQ;AAExCH,QAAA,CAAS,2BAA2B;EAClCE,EAAA,CAAG,sDAAsD;IACvDD,MAAA,CAAOE,uBAAA,CAAwB;MAAEC,cAAA,EAAgB;MAAGC,QAAA,EAAU;IAAE,IAAIC,IAAI,CAAC;EAC3E;EAEAJ,EAAA,CAAG,4DAA4D;IAC7DD,MAAA,CAAOE,uBAAA,CAAwB;MAAEC,cAAA,EAAgB;MAAGC,QAAA,EAAU;IAAE,IAAIC,IAAI,CAAC;EAC3E;EAEAJ,EAAA,CAAG,kDAAkD;IACnDD,MAAA,CAAOE,uBAAA,CAAwB;MAAEC,cAAA,EAAgBG,SAAA;MAAWF,QAAA,EAAU;IAAE,IAAIG,aAAa;EAC3F;EAEAN,EAAA,CAAG,wDAAwD;IACzDD,MAAA,CAAOE,uBAAA,CAAwB;MAAEC,cAAA,EAAgB;MAAMC,QAAA,EAAU;IAAE,IAAIG,aAAa;EACtF;EAEAN,EAAA,CAAG,gEAAgE;IACjED,MAAA,CAAOE,uBAAA,CAAwB;MAAEC,cAAA,EAAgB;MAAKC,QAAA,EAAU;IAAE,IAAIG,aAAa;EACrF;EAEAN,EAAA,CAAG,sEAAsE;IACvED,MAAA,CAAOE,uBAAA,CAAwB;MAAEC,cAAA,EAAgB;MAAGC,QAAA,EAAU;IAAE,IAAIG,aAAa;EACnF;EAEAN,EAAA,CAAG,4DAA4D;IAC7DD,MAAA,CAAOE,uBAAA,CAAwB;MAAEC,cAAA,EAAgB,CAAC;MAAGC,QAAA,EAAU;IAAE,IAAIG,aAAa;EACpF;EAEAN,EAAA,CAAG,iDAAiD;IAClDD,MAAA,CAAOE,uBAAA,CAAwB;MAAEC,cAAA,EAAgB;MAAGC,QAAA,EAAU;IAAE,IAAIG,aAAa;EACnF;AACF","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/forms/Form/index.tsx"],"names":[],"mappings":"AAaA,OAAO,KAA+D,MAAM,OAAO,CAAA;AAGnF,OAAO,KAAK,EAGV,SAAS,EAIV,MAAM,YAAY,CAAA;AAoCnB,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,CA+1BpC,CAAA;AAED,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,OAAO,EACP,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,GACb,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,SAAS,EAAE,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/forms/Form/index.tsx"],"names":[],"mappings":"AAcA,OAAO,KAA+D,MAAM,OAAO,CAAA;AAGnF,OAAO,KAAK,EAGV,SAAS,EAIV,MAAM,YAAY,CAAA;AAoCnB,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,CAs2BpC,CAAA;AAED,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,OAAO,EACP,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,GACb,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,SAAS,EAAE,CAAA"}
@@ -4,7 +4,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
4
4
  import { dequal } from 'dequal/lite'; // lite: no need for Map and Set support
5
5
  import { useRouter } from 'next/navigation.js';
6
6
  import { serialize } from 'object-to-formdata';
7
- import { deepCopyObjectSimpleWithoutReactComponents, getDataByPath as getDataByPathFunc, getSiblingData as getSiblingDataFunc, hasDraftValidationEnabled, reduceFieldsToValues, wait } from 'payload/shared';
7
+ import { deepCopyObjectSimpleWithoutReactComponents, getDataByPath as getDataByPathFunc, getSiblingData as getSiblingDataFunc, hasDraftValidationEnabled, reduceFieldsToValues, uploadRequiresServerValidation, wait } from 'payload/shared';
8
8
  import React, { useCallback, useEffect, useReducer, useRef, useState } from 'react';
9
9
  import { toast } from 'sonner';
10
10
  import { FieldErrorsToast } from '../../elements/Toasts/fieldErrors.js';
@@ -446,7 +446,11 @@ export const Form = props => {
446
446
  const handler = getUploadHandler({
447
447
  collectionSlug
448
448
  });
449
- if (typeof handler === 'function') {
449
+ if (typeof handler === 'function' && !uploadRequiresServerValidation({
450
+ allowRestrictedFileTypes: docConfig.upload.allowRestrictedFileTypes,
451
+ filename: file.name,
452
+ mimeType: file.type
453
+ })) {
450
454
  let filename = file.name;
451
455
  const clientUploadContext = await handler({
452
456
  docPrefix: typeof data_5?.prefix === 'string' ? data_5.prefix : undefined,