@strapi/content-type-builder 5.56.0 → 5.58.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 (178) hide show
  1. package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js +117 -13
  2. package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js.map +1 -1
  3. package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.mjs +118 -13
  4. package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.mjs.map +1 -1
  5. package/dist/admin/components/AIChat/providers/SchemaProvider.js +31 -19
  6. package/dist/admin/components/AIChat/providers/SchemaProvider.js.map +1 -1
  7. package/dist/admin/components/AIChat/providers/SchemaProvider.mjs +31 -19
  8. package/dist/admin/components/AIChat/providers/SchemaProvider.mjs.map +1 -1
  9. package/dist/admin/components/DataManager/DataManagerContext.js.map +1 -1
  10. package/dist/admin/components/DataManager/DataManagerContext.mjs.map +1 -1
  11. package/dist/admin/components/DataManager/DataManagerProvider.js +166 -6
  12. package/dist/admin/components/DataManager/DataManagerProvider.js.map +1 -1
  13. package/dist/admin/components/DataManager/DataManagerProvider.mjs +165 -7
  14. package/dist/admin/components/DataManager/DataManagerProvider.mjs.map +1 -1
  15. package/dist/admin/components/DataManager/RenameMigrationModal.js +285 -0
  16. package/dist/admin/components/DataManager/RenameMigrationModal.js.map +1 -0
  17. package/dist/admin/components/DataManager/RenameMigrationModal.mjs +257 -0
  18. package/dist/admin/components/DataManager/RenameMigrationModal.mjs.map +1 -0
  19. package/dist/admin/components/DataManager/reducer.js +129 -2
  20. package/dist/admin/components/DataManager/reducer.js.map +1 -1
  21. package/dist/admin/components/DataManager/reducer.mjs +128 -2
  22. package/dist/admin/components/DataManager/reducer.mjs.map +1 -1
  23. package/dist/admin/components/DataManager/utils/cleanData.js +8 -1
  24. package/dist/admin/components/DataManager/utils/cleanData.js.map +1 -1
  25. package/dist/admin/components/DataManager/utils/cleanData.mjs +8 -1
  26. package/dist/admin/components/DataManager/utils/cleanData.mjs.map +1 -1
  27. package/dist/admin/components/DataManager/utils/groupRenameChains.js +86 -0
  28. package/dist/admin/components/DataManager/utils/groupRenameChains.js.map +1 -0
  29. package/dist/admin/components/DataManager/utils/groupRenameChains.mjs +84 -0
  30. package/dist/admin/components/DataManager/utils/groupRenameChains.mjs.map +1 -0
  31. package/dist/admin/components/DataManager/utils/isStorageCompatibleRename.js +29 -0
  32. package/dist/admin/components/DataManager/utils/isStorageCompatibleRename.js.map +1 -0
  33. package/dist/admin/components/DataManager/utils/isStorageCompatibleRename.mjs +27 -0
  34. package/dist/admin/components/DataManager/utils/isStorageCompatibleRename.mjs.map +1 -0
  35. package/dist/admin/components/DataManager/utils/resolveAfterEditRenameConsent.js +35 -0
  36. package/dist/admin/components/DataManager/utils/resolveAfterEditRenameConsent.js.map +1 -0
  37. package/dist/admin/components/DataManager/utils/resolveAfterEditRenameConsent.mjs +33 -0
  38. package/dist/admin/components/DataManager/utils/resolveAfterEditRenameConsent.mjs.map +1 -0
  39. package/dist/admin/components/DataManager/utils/splitChainsByInheritedConsent.js +48 -0
  40. package/dist/admin/components/DataManager/utils/splitChainsByInheritedConsent.js.map +1 -0
  41. package/dist/admin/components/DataManager/utils/splitChainsByInheritedConsent.mjs +45 -0
  42. package/dist/admin/components/DataManager/utils/splitChainsByInheritedConsent.mjs.map +1 -0
  43. package/dist/admin/components/FormModal/FormModal.js +178 -70
  44. package/dist/admin/components/FormModal/FormModal.js.map +1 -1
  45. package/dist/admin/components/FormModal/FormModal.mjs +179 -71
  46. package/dist/admin/components/FormModal/FormModal.mjs.map +1 -1
  47. package/dist/admin/components/FormModal/attributes/validation/common.js +6 -5
  48. package/dist/admin/components/FormModal/attributes/validation/common.js.map +1 -1
  49. package/dist/admin/components/FormModal/attributes/validation/common.mjs +1 -1
  50. package/dist/admin/components/FormModal/attributes/validation/common.mjs.map +1 -1
  51. package/dist/admin/components/FormModal/component/createComponentSchema.js +10 -7
  52. package/dist/admin/components/FormModal/component/createComponentSchema.js.map +1 -1
  53. package/dist/admin/components/FormModal/component/createComponentSchema.mjs +1 -1
  54. package/dist/admin/components/FormModal/component/createComponentSchema.mjs.map +1 -1
  55. package/dist/admin/components/FormModal/contentType/createContentTypeSchema.js +24 -21
  56. package/dist/admin/components/FormModal/contentType/createContentTypeSchema.js.map +1 -1
  57. package/dist/admin/components/FormModal/contentType/createContentTypeSchema.mjs +1 -1
  58. package/dist/admin/components/FormModal/contentType/createContentTypeSchema.mjs.map +1 -1
  59. package/dist/admin/components/FormModal/forms/utils/createCollectionName.js +3 -2
  60. package/dist/admin/components/FormModal/forms/utils/createCollectionName.js.map +1 -1
  61. package/dist/admin/components/FormModal/forms/utils/createCollectionName.mjs +1 -1
  62. package/dist/admin/components/FormModal/forms/utils/createCollectionName.mjs.map +1 -1
  63. package/dist/admin/components/FormModal/utils/getRenameStorageChange.js +73 -0
  64. package/dist/admin/components/FormModal/utils/getRenameStorageChange.js.map +1 -0
  65. package/dist/admin/components/FormModal/utils/getRenameStorageChange.mjs +70 -0
  66. package/dist/admin/components/FormModal/utils/getRenameStorageChange.mjs.map +1 -0
  67. package/dist/admin/src/components/AIChat/lib/transforms/schemas/toCTB.d.ts +4 -3
  68. package/dist/admin/src/components/AIChat/lib/types/schema.d.ts +6 -1
  69. package/dist/admin/src/components/DataManager/DataManagerContext.d.ts +28 -2
  70. package/dist/admin/src/components/DataManager/RenameMigrationModal.d.ts +73 -0
  71. package/dist/admin/src/components/DataManager/reducer.d.ts +17 -2
  72. package/dist/admin/src/components/DataManager/utils/cleanData.d.ts +24 -8
  73. package/dist/admin/src/components/DataManager/utils/groupRenameChains.d.ts +31 -0
  74. package/dist/admin/src/components/DataManager/utils/isStorageCompatibleRename.d.ts +10 -0
  75. package/dist/admin/src/components/DataManager/utils/resolveAfterEditRenameConsent.d.ts +24 -0
  76. package/dist/admin/src/components/DataManager/utils/splitChainsByInheritedConsent.d.ts +26 -0
  77. package/dist/admin/src/components/FormModal/utils/getRenameStorageChange.d.ts +40 -0
  78. package/dist/admin/src/types.d.ts +23 -0
  79. package/dist/admin/translations/cs.json.js +0 -2
  80. package/dist/admin/translations/cs.json.js.map +1 -1
  81. package/dist/admin/translations/cs.json.mjs +0 -2
  82. package/dist/admin/translations/cs.json.mjs.map +1 -1
  83. package/dist/admin/translations/de.json.js +0 -2
  84. package/dist/admin/translations/de.json.js.map +1 -1
  85. package/dist/admin/translations/de.json.mjs +0 -2
  86. package/dist/admin/translations/de.json.mjs.map +1 -1
  87. package/dist/admin/translations/en.json.js +12 -2
  88. package/dist/admin/translations/en.json.js.map +1 -1
  89. package/dist/admin/translations/en.json.mjs +12 -2
  90. package/dist/admin/translations/en.json.mjs.map +1 -1
  91. package/dist/admin/translations/ja.json.js +0 -2
  92. package/dist/admin/translations/ja.json.js.map +1 -1
  93. package/dist/admin/translations/ja.json.mjs +0 -2
  94. package/dist/admin/translations/ja.json.mjs.map +1 -1
  95. package/dist/admin/translations/ko.json.js +0 -2
  96. package/dist/admin/translations/ko.json.js.map +1 -1
  97. package/dist/admin/translations/ko.json.mjs +0 -2
  98. package/dist/admin/translations/ko.json.mjs.map +1 -1
  99. package/dist/admin/translations/nl.json.js +0 -2
  100. package/dist/admin/translations/nl.json.js.map +1 -1
  101. package/dist/admin/translations/nl.json.mjs +0 -2
  102. package/dist/admin/translations/nl.json.mjs.map +1 -1
  103. package/dist/admin/translations/pl.json.js +0 -2
  104. package/dist/admin/translations/pl.json.js.map +1 -1
  105. package/dist/admin/translations/pl.json.mjs +0 -2
  106. package/dist/admin/translations/pl.json.mjs.map +1 -1
  107. package/dist/admin/translations/ru.json.js +0 -2
  108. package/dist/admin/translations/ru.json.js.map +1 -1
  109. package/dist/admin/translations/ru.json.mjs +0 -2
  110. package/dist/admin/translations/ru.json.mjs.map +1 -1
  111. package/dist/admin/translations/sk.json.js +0 -2
  112. package/dist/admin/translations/sk.json.js.map +1 -1
  113. package/dist/admin/translations/sk.json.mjs +0 -2
  114. package/dist/admin/translations/sk.json.mjs.map +1 -1
  115. package/dist/server/config.js +24 -3
  116. package/dist/server/config.js.map +1 -1
  117. package/dist/server/config.mjs +21 -3
  118. package/dist/server/config.mjs.map +1 -1
  119. package/dist/server/controllers/schema.js +2 -2
  120. package/dist/server/controllers/schema.js.map +1 -1
  121. package/dist/server/controllers/schema.mjs +1 -1
  122. package/dist/server/controllers/schema.mjs.map +1 -1
  123. package/dist/server/controllers/validation/content-type.js +9 -11
  124. package/dist/server/controllers/validation/content-type.js.map +1 -1
  125. package/dist/server/controllers/validation/content-type.mjs +7 -9
  126. package/dist/server/controllers/validation/content-type.mjs.map +1 -1
  127. package/dist/server/controllers/validation/model-schema.js +2 -3
  128. package/dist/server/controllers/validation/model-schema.js.map +1 -1
  129. package/dist/server/controllers/validation/model-schema.mjs +1 -2
  130. package/dist/server/controllers/validation/model-schema.mjs.map +1 -1
  131. package/dist/server/controllers/validation/relations.js +1 -2
  132. package/dist/server/controllers/validation/relations.js.map +1 -1
  133. package/dist/server/controllers/validation/relations.mjs +1 -2
  134. package/dist/server/controllers/validation/relations.mjs.map +1 -1
  135. package/dist/server/controllers/validation/schema.js +42 -23
  136. package/dist/server/controllers/validation/schema.js.map +1 -1
  137. package/dist/server/controllers/validation/schema.mjs +43 -24
  138. package/dist/server/controllers/validation/schema.mjs.map +1 -1
  139. package/dist/server/index.js +1 -1
  140. package/dist/server/index.js.map +1 -1
  141. package/dist/server/services/content-types.js +1 -2
  142. package/dist/server/services/content-types.js.map +1 -1
  143. package/dist/server/services/content-types.mjs +2 -3
  144. package/dist/server/services/content-types.mjs.map +1 -1
  145. package/dist/server/services/migration-builder/index.js +580 -0
  146. package/dist/server/services/migration-builder/index.js.map +1 -0
  147. package/dist/server/services/migration-builder/index.mjs +573 -0
  148. package/dist/server/services/migration-builder/index.mjs.map +1 -0
  149. package/dist/server/services/schema-builder/content-type-builder.js +31 -1
  150. package/dist/server/services/schema-builder/content-type-builder.js.map +1 -1
  151. package/dist/server/services/schema-builder/content-type-builder.mjs +31 -1
  152. package/dist/server/services/schema-builder/content-type-builder.mjs.map +1 -1
  153. package/dist/server/services/schema-mutation.js +30 -2
  154. package/dist/server/services/schema-mutation.js.map +1 -1
  155. package/dist/server/services/schema-mutation.mjs +10 -2
  156. package/dist/server/services/schema-mutation.mjs.map +1 -1
  157. package/dist/server/services/schema.js +312 -15
  158. package/dist/server/services/schema.js.map +1 -1
  159. package/dist/server/services/schema.mjs +305 -9
  160. package/dist/server/services/schema.mjs.map +1 -1
  161. package/dist/server/src/config.d.ts +23 -2
  162. package/dist/server/src/config.d.ts.map +1 -1
  163. package/dist/server/src/controllers/validation/content-type.d.ts +0 -1
  164. package/dist/server/src/controllers/validation/content-type.d.ts.map +1 -1
  165. package/dist/server/src/controllers/validation/relations.d.ts.map +1 -1
  166. package/dist/server/src/controllers/validation/schema.d.ts +28 -0
  167. package/dist/server/src/controllers/validation/schema.d.ts.map +1 -1
  168. package/dist/server/src/index.d.ts +10 -2
  169. package/dist/server/src/index.d.ts.map +1 -1
  170. package/dist/server/src/services/content-types.d.ts.map +1 -1
  171. package/dist/server/src/services/migration-builder/index.d.ts +83 -0
  172. package/dist/server/src/services/migration-builder/index.d.ts.map +1 -0
  173. package/dist/server/src/services/schema-builder/content-type-builder.d.ts.map +1 -1
  174. package/dist/server/src/services/schema-mutation.d.ts +4 -2
  175. package/dist/server/src/services/schema-mutation.d.ts.map +1 -1
  176. package/dist/server/src/services/schema.d.ts +19 -0
  177. package/dist/server/src/services/schema.d.ts.map +1 -1
  178. package/package.json +7 -6
@@ -54,6 +54,7 @@ var canEditContentType = require('./utils/canEditContentType.js');
54
54
  var createUid = require('./utils/createUid.js');
55
55
  var getAttributesToDisplay = require('./utils/getAttributesToDisplay.js');
56
56
  var getFormInputNames = require('./utils/getFormInputNames.js');
57
+ var getRenameStorageChange = require('./utils/getRenameStorageChange.js');
57
58
 
58
59
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
59
60
 
@@ -116,44 +117,48 @@ const FormModal = ()=>{
116
117
  const ctbFormsAPI = ctbPlugin?.apis.forms;
117
118
  const inputsFromPlugins = ctbFormsAPI.components.inputs;
118
119
  const dispatchGuidedTour = strapiAdmin.useGuidedTour('FormModal', (s)=>s.dispatch);
119
- const { addAttribute, editAttribute, addCustomFieldAttribute, addCreatedComponentToDynamicZone, changeDynamicZoneComponents, contentTypes, components, createSchema, createComponentSchema, deleteComponent, deleteContentType, editCustomFieldAttribute, updateSchema, nestedComponents, sortedContentTypesList, updateComponentSchema, updateComponentUid, reservedNames } = useDataManager.useDataManager();
120
+ const { addAttribute, editAttribute, addCustomFieldAttribute, addCreatedComponentToDynamicZone, changeDynamicZoneComponents, contentTypes, components, createSchema, createComponentSchema, deleteComponent, deleteContentType, editCustomFieldAttribute, updateSchema, nestedComponents, sortedContentTypesList, updateComponentSchema, updateComponentUid, reservedNames, confirmAttributeRenameMigration, attributeRenameMigrationMode } = useDataManager.useDataManager();
120
121
  const { componentToCreate, formErrors, initialData, isCreatingComponentWhileAddingAField, modifiedData } = reducerState;
121
122
  const type = forTarget === 'component' ? components[targetUid] : contentTypes[targetUid];
122
123
  const [showWarningDialog, setShowWarningDialog] = React.useState(false);
123
124
  const [pendingSubmit, setPendingSubmit] = React.useState(null);
124
- const checkFieldNameChanges = ()=>{
125
- // Only check when editing an attribute
125
+ // Set when the edit renames an existing field *and* changes its storage: the
126
+ // data cannot be preserved, so the user confirms before the field is recreated.
127
+ const [storageChangeWarning, setStorageChangeWarning] = React.useState(null);
128
+ const checkRenameStorageChange = ()=>{
129
+ if (actionType !== 'edit' || modalType !== 'attribute' && modalType !== 'customField') {
130
+ return null;
131
+ }
132
+ return getRenameStorageChange.getRenameStorageChange(initialData, modifiedData, attributeRenameMigrationMode);
133
+ };
134
+ /**
135
+ * Fields whose visibility condition depends on this field and references an
136
+ * enum value that this edit removes or changes. Renames are followed
137
+ * automatically, so only an enum value change can break a condition.
138
+ */ const getConditionsBrokenByEnumChange = ()=>{
126
139
  if (actionType !== 'edit' || modalType !== 'attribute') {
127
140
  return false;
128
141
  }
129
- const oldName = initialData.name;
130
142
  const oldEnum = initialData.enum;
131
143
  const newEnum = modifiedData.enum;
132
- // Get all attributes from the content type schema
144
+ if (!Array.isArray(oldEnum) || !Array.isArray(newEnum)) {
145
+ return false;
146
+ }
147
+ const removedValues = oldEnum.filter((value)=>!newEnum.includes(value));
148
+ if (removedValues.length === 0) {
149
+ return false;
150
+ }
151
+ const fieldName = initialData.name;
133
152
  const contentTypeAttributes = type?.attributes ?? [];
134
- // Find all fields that reference this field in their conditions
135
- const referencedFields = contentTypeAttributes.filter((attr)=>{
153
+ const brokenFields = contentTypeAttributes.filter((attr)=>{
136
154
  const conditionEntry = conditions.getFirstVisibleConditionEntry(attr.conditions);
137
155
  if (conditionEntry === null) {
138
156
  return false;
139
157
  }
140
158
  const { fieldVar, value } = conditionEntry;
141
- // Check if this condition references our field
142
- if (fieldVar.var !== oldName) {
143
- return false;
144
- }
145
- // If it's an enum field, also check if the value is being deleted/changed
146
- if (oldEnum !== undefined && newEnum !== undefined) {
147
- const deletedOrChangedValues = oldEnum.filter((oldValue)=>!newEnum.includes(oldValue));
148
- return typeof value === 'string' && deletedOrChangedValues.includes(value);
149
- }
150
- return true;
159
+ return fieldVar.var === fieldName && typeof value === 'string' && removedValues.includes(value);
151
160
  });
152
- // If any fields reference this field, return them
153
- if (referencedFields.length > 0) {
154
- return referencedFields;
155
- }
156
- return false;
161
+ return brokenFields.length > 0 ? brokenFields : false;
157
162
  };
158
163
  React__namespace.useEffect(()=>{
159
164
  if (isOpen && modalType) {
@@ -412,9 +417,48 @@ const FormModal = ()=>{
412
417
  dispatch,
413
418
  formErrors
414
419
  ]);
415
- const submitForm = async (e, shouldContinue = isCreating)=>{
420
+ const submitForm = async (e, shouldContinue = isCreating, // The user already confirmed the field will be recreated empty (rename +
421
+ // storage change): there is no data to preserve, so don't ask about it.
422
+ { skipRenameMigration = false } = {})=>{
416
423
  try {
417
424
  await checkFormValidity();
425
+ let recordRename = !skipRenameMigration;
426
+ let declineRename = false;
427
+ if (!skipRenameMigration && actionType === 'edit' && (isCreatingAttribute || isCreatingCustomFieldAttribute) && // A field that was never saved has no data to preserve (and
428
+ // `recordRename` skips it), so there is nothing to ask about.
429
+ initialData.status !== 'NEW' && toStringValue(initialData.name) !== toStringValue(modifiedData.name)) {
430
+ const decision = await confirmAttributeRenameMigration({
431
+ forTarget,
432
+ uid: targetUid,
433
+ oldName: toStringValue(initialData.name),
434
+ newName: toStringValue(modifiedData.name)
435
+ });
436
+ if (decision === null) {
437
+ return;
438
+ }
439
+ recordRename = decision;
440
+ declineRename = !decision;
441
+ }
442
+ // Renaming the other side of a relation from this form renames a field
443
+ // of the target type, which may own the join table: ask for that one
444
+ // too, after the field's own prompt.
445
+ const oldTargetAttribute = toStringValue(initialData.targetAttribute);
446
+ const newTargetAttribute = toStringValue(modifiedData.targetAttribute);
447
+ let recordTargetRename = !skipRenameMigration;
448
+ let declineTargetRename = false;
449
+ if (!skipRenameMigration && actionType === 'edit' && isCreatingAttribute && attributeType === 'relation' && oldTargetAttribute !== '' && newTargetAttribute !== '' && oldTargetAttribute !== newTargetAttribute && toStringValue(initialData.target) === toStringValue(modifiedData.target)) {
450
+ const decision = await confirmAttributeRenameMigration({
451
+ forTarget: 'contentType',
452
+ uid: toStringValue(modifiedData.target),
453
+ oldName: oldTargetAttribute,
454
+ newName: newTargetAttribute
455
+ });
456
+ if (decision === null) {
457
+ return;
458
+ }
459
+ recordTargetRename = decision;
460
+ declineTargetRename = !decision;
461
+ }
418
462
  dispatch(reducer.actions.setErrors({
419
463
  errors: {}
420
464
  }));
@@ -533,7 +577,9 @@ const FormModal = ()=>{
533
577
  },
534
578
  forTarget,
535
579
  targetUid,
536
- name: toStringValue(initialData.name)
580
+ name: toStringValue(initialData.name),
581
+ recordRename,
582
+ declineRename
537
583
  };
538
584
  if (actionType === 'edit') {
539
585
  editCustomFieldAttribute(customFieldAttributeUpdate);
@@ -564,7 +610,9 @@ const FormModal = ()=>{
564
610
  attributeToSet: modifiedData,
565
611
  forTarget,
566
612
  targetUid,
567
- name: toStringValue(initialData.name)
613
+ name: toStringValue(initialData.name),
614
+ recordRename,
615
+ declineRename
568
616
  });
569
617
  }
570
618
  // Adding a component to a dynamiczone is not the same logic as creating a simple field
@@ -594,7 +642,11 @@ const FormModal = ()=>{
594
642
  attributeToSet: modifiedData,
595
643
  forTarget,
596
644
  targetUid,
597
- name: toStringValue(initialData.name)
645
+ name: toStringValue(initialData.name),
646
+ recordRename,
647
+ declineRename,
648
+ recordTargetRename,
649
+ declineTargetRename
598
650
  });
599
651
  }
600
652
  if (shouldContinue) {
@@ -650,7 +702,9 @@ const FormModal = ()=>{
650
702
  attributeToSet: attributeData,
651
703
  forTarget,
652
704
  targetUid,
653
- name: toStringValue(initialData.name)
705
+ name: toStringValue(initialData.name),
706
+ recordRename,
707
+ declineRename
654
708
  });
655
709
  }
656
710
  if (shouldContinue) {
@@ -771,11 +825,39 @@ const FormModal = ()=>{
771
825
  }
772
826
  }
773
827
  };
828
+ // Runs after the condition warning (if any): warn when the rename also
829
+ // changes the field's storage, otherwise submit.
830
+ const continueSubmit = async (e, shouldContinue)=>{
831
+ const storageChange = checkRenameStorageChange();
832
+ if (storageChange) {
833
+ setPendingSubmit({
834
+ e,
835
+ shouldContinue
836
+ });
837
+ setStorageChangeWarning(storageChange);
838
+ return;
839
+ }
840
+ await submitForm(e, shouldContinue);
841
+ };
842
+ const cancelStorageChange = ()=>{
843
+ setStorageChangeWarning(null);
844
+ setPendingSubmit(null);
845
+ };
846
+ const confirmStorageChange = ()=>{
847
+ if (pendingSubmit === null) {
848
+ return;
849
+ }
850
+ const { e, shouldContinue } = pendingSubmit;
851
+ cancelStorageChange();
852
+ submitForm(e, shouldContinue, {
853
+ skipRenameMigration: true
854
+ });
855
+ };
774
856
  const handleSubmit = async (e, shouldContinue = isCreating)=>{
775
857
  e.preventDefault();
776
- // Check for field name changes when clicking Finish
777
- const referencedFields = checkFieldNameChanges();
778
- if (referencedFields) {
858
+ // Check for conditions broken by an enum value change when clicking Finish
859
+ const brokenFields = getConditionsBrokenByEnumChange();
860
+ if (brokenFields) {
779
861
  setPendingSubmit({
780
862
  e,
781
863
  shouldContinue
@@ -783,7 +865,7 @@ const FormModal = ()=>{
783
865
  setShowWarningDialog(true);
784
866
  return;
785
867
  }
786
- await submitForm(e, shouldContinue);
868
+ await continueSubmit(e, shouldContinue);
787
869
  };
788
870
  const handleConfirmClose = ()=>{
789
871
  // eslint-disable-next-line no-alert
@@ -947,7 +1029,7 @@ const FormModal = ()=>{
947
1029
  const { e, shouldContinue } = pendingSubmit;
948
1030
  setShowWarningDialog(false);
949
1031
  setPendingSubmit(null);
950
- submitForm(e, shouldContinue);
1032
+ continueSubmit(e, shouldContinue);
951
1033
  }
952
1034
  },
953
1035
  onCancel: ()=>{
@@ -955,46 +1037,17 @@ const FormModal = ()=>{
955
1037
  setPendingSubmit(null);
956
1038
  },
957
1039
  children: (()=>{
958
- const referencedFields = checkFieldNameChanges();
959
- if (referencedFields === false) return null;
960
- const fieldNames = referencedFields.map((field)=>field.name).join(', ');
961
- const oldEnum = initialData.enum;
962
- const newEnum = modifiedData.enum;
963
- const isEnum = Array.isArray(oldEnum) && Array.isArray(newEnum);
964
- if (isEnum === true) {
965
- const deletedOrChangedValues = oldEnum.filter((value)=>!newEnum.includes(value));
966
- return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
967
- children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Typography, {
968
- children: [
969
- formatMessage({
970
- id: 'form.attribute.condition.enum-change-warning',
971
- defaultMessage: 'The following fields have conditions that depend on this field: '
972
- }),
973
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
974
- fontWeight: "bold",
975
- children: fieldNames
976
- }),
977
- formatMessage({
978
- id: 'form.attribute.condition.enum-change-warning-values',
979
- defaultMessage: '. Changing or removing the enum values '
980
- }),
981
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
982
- fontWeight: "bold",
983
- children: deletedOrChangedValues.join(', ')
984
- }),
985
- formatMessage({
986
- id: 'form.attribute.condition.enum-change-warning-end',
987
- defaultMessage: ' will break these conditions. Do you want to proceed?'
988
- })
989
- ]
990
- })
991
- });
992
- }
1040
+ const brokenFields = getConditionsBrokenByEnumChange();
1041
+ if (brokenFields === false) return null;
1042
+ const fieldNames = brokenFields.map((field)=>field.name).join(', ');
1043
+ const oldEnum = initialData.enum ?? [];
1044
+ const newEnum = modifiedData.enum ?? [];
1045
+ const deletedOrChangedValues = oldEnum.filter((value)=>!newEnum.includes(value));
993
1046
  return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
994
1047
  children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Typography, {
995
1048
  children: [
996
1049
  formatMessage({
997
- id: 'form.attribute.condition.field-change-warning',
1050
+ id: 'form.attribute.condition.enum-change-warning',
998
1051
  defaultMessage: 'The following fields have conditions that depend on this field: '
999
1052
  }),
1000
1053
  /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
@@ -1002,8 +1055,16 @@ const FormModal = ()=>{
1002
1055
  children: fieldNames
1003
1056
  }),
1004
1057
  formatMessage({
1005
- id: 'form.attribute.condition.field-change-warning-end',
1006
- defaultMessage: '. Renaming it will break these conditions. Do you want to proceed?'
1058
+ id: 'form.attribute.condition.enum-change-warning-values',
1059
+ defaultMessage: '. Changing or removing the enum values '
1060
+ }),
1061
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
1062
+ fontWeight: "bold",
1063
+ children: deletedOrChangedValues.join(', ')
1064
+ }),
1065
+ formatMessage({
1066
+ id: 'form.attribute.condition.enum-change-warning-end',
1067
+ defaultMessage: ' will break these conditions. Do you want to proceed?'
1007
1068
  })
1008
1069
  ]
1009
1070
  })
@@ -1012,6 +1073,53 @@ const FormModal = ()=>{
1012
1073
  })
1013
1074
  ]
1014
1075
  }),
1076
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Dialog.Root, {
1077
+ open: storageChangeWarning !== null,
1078
+ onOpenChange: (open)=>!open && cancelStorageChange(),
1079
+ children: /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.ConfirmDialog, {
1080
+ title: formatMessage({
1081
+ id: getTrad.getTrad('form.attribute.rename-type-change-warning.title'),
1082
+ defaultMessage: 'Existing data will be lost'
1083
+ }),
1084
+ onCancel: cancelStorageChange,
1085
+ endAction: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Dialog.Action, {
1086
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
1087
+ fullWidth: true,
1088
+ variant: "danger",
1089
+ onClick: confirmStorageChange,
1090
+ children: formatMessage({
1091
+ id: getTrad.getTrad('form.attribute.rename-type-change-warning.confirm'),
1092
+ defaultMessage: 'Continue'
1093
+ })
1094
+ })
1095
+ }),
1096
+ children: storageChangeWarning && /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
1097
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
1098
+ children: formatMessage({
1099
+ id: getTrad.getTrad('form.attribute.rename-type-change-warning.body'),
1100
+ defaultMessage: 'You are renaming {oldName} to {newName} and changing it from {oldType} to {newType}. Strapi cannot preserve the existing data of this field when both change at once. The field will be recreated empty when you save.'
1101
+ }, {
1102
+ oldName: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
1103
+ fontWeight: "bold",
1104
+ children: storageChangeWarning.oldName
1105
+ }),
1106
+ newName: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
1107
+ fontWeight: "bold",
1108
+ children: storageChangeWarning.newName
1109
+ }),
1110
+ oldType: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
1111
+ fontWeight: "bold",
1112
+ children: storageChangeWarning.oldType
1113
+ }),
1114
+ newType: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
1115
+ fontWeight: "bold",
1116
+ children: storageChangeWarning.newType
1117
+ })
1118
+ })
1119
+ })
1120
+ })
1121
+ })
1122
+ }),
1015
1123
  /*#__PURE__*/ jsxRuntime.jsx(FormModalHeader.FormModalHeader, {
1016
1124
  actionType: actionType,
1017
1125
  attributeName: attributeName,