@strapi/content-type-builder 5.58.0 → 5.59.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 (126) hide show
  1. package/dist/admin/components/AIChat/FeedbackModal.js +13 -7
  2. package/dist/admin/components/AIChat/FeedbackModal.js.map +1 -1
  3. package/dist/admin/components/AIChat/FeedbackModal.mjs +14 -8
  4. package/dist/admin/components/AIChat/FeedbackModal.mjs.map +1 -1
  5. package/dist/admin/components/AIChat/UploadCodeModal.js +12 -6
  6. package/dist/admin/components/AIChat/UploadCodeModal.js.map +1 -1
  7. package/dist/admin/components/AIChat/UploadCodeModal.mjs +13 -7
  8. package/dist/admin/components/AIChat/UploadCodeModal.mjs.map +1 -1
  9. package/dist/admin/components/AIChat/UploadFigmaModal.js +12 -6
  10. package/dist/admin/components/AIChat/UploadFigmaModal.js.map +1 -1
  11. package/dist/admin/components/AIChat/UploadFigmaModal.mjs +13 -7
  12. package/dist/admin/components/AIChat/UploadFigmaModal.mjs.map +1 -1
  13. package/dist/admin/components/AIChat/components/Attachments/components/Attachment.js +6 -3
  14. package/dist/admin/components/AIChat/components/Attachments/components/Attachment.js.map +1 -1
  15. package/dist/admin/components/AIChat/components/Attachments/components/Attachment.mjs +7 -4
  16. package/dist/admin/components/AIChat/components/Attachments/components/Attachment.mjs.map +1 -1
  17. package/dist/admin/components/AIChat/components/Collapsible.js +9 -4
  18. package/dist/admin/components/AIChat/components/Collapsible.js.map +1 -1
  19. package/dist/admin/components/AIChat/components/Collapsible.mjs +10 -5
  20. package/dist/admin/components/AIChat/components/Collapsible.mjs.map +1 -1
  21. package/dist/admin/components/AIChat/components/Dropzone.js +13 -6
  22. package/dist/admin/components/AIChat/components/Dropzone.js.map +1 -1
  23. package/dist/admin/components/AIChat/components/Dropzone.mjs +14 -7
  24. package/dist/admin/components/AIChat/components/Dropzone.mjs.map +1 -1
  25. package/dist/admin/components/AIChat/components/FloatingPanel.js +11 -4
  26. package/dist/admin/components/AIChat/components/FloatingPanel.js.map +1 -1
  27. package/dist/admin/components/AIChat/components/FloatingPanel.mjs +12 -5
  28. package/dist/admin/components/AIChat/components/FloatingPanel.mjs.map +1 -1
  29. package/dist/admin/components/AIChat/components/FullScreenImage.js +16 -8
  30. package/dist/admin/components/AIChat/components/FullScreenImage.js.map +1 -1
  31. package/dist/admin/components/AIChat/components/FullScreenImage.mjs +17 -9
  32. package/dist/admin/components/AIChat/components/FullScreenImage.mjs.map +1 -1
  33. package/dist/admin/components/AIChat/components/Input.js +6 -3
  34. package/dist/admin/components/AIChat/components/Input.js.map +1 -1
  35. package/dist/admin/components/AIChat/components/Input.mjs +7 -4
  36. package/dist/admin/components/AIChat/components/Input.mjs.map +1 -1
  37. package/dist/admin/components/AIChat/components/Messages/Message.js +88 -12
  38. package/dist/admin/components/AIChat/components/Messages/Message.js.map +1 -1
  39. package/dist/admin/components/AIChat/components/Messages/Message.mjs +87 -13
  40. package/dist/admin/components/AIChat/components/Messages/Message.mjs.map +1 -1
  41. package/dist/admin/components/AIChat/components/StepModal.js +44 -17
  42. package/dist/admin/components/AIChat/components/StepModal.js.map +1 -1
  43. package/dist/admin/components/AIChat/components/StepModal.mjs +45 -18
  44. package/dist/admin/components/AIChat/components/StepModal.mjs.map +1 -1
  45. package/dist/admin/components/AIChat/providers/ChatProvider.js +79 -27
  46. package/dist/admin/components/AIChat/providers/ChatProvider.js.map +1 -1
  47. package/dist/admin/components/AIChat/providers/ChatProvider.mjs +80 -28
  48. package/dist/admin/components/AIChat/providers/ChatProvider.mjs.map +1 -1
  49. package/dist/admin/components/AIChat/providers/SchemaProvider.js +6 -3
  50. package/dist/admin/components/AIChat/providers/SchemaProvider.js.map +1 -1
  51. package/dist/admin/components/AIChat/providers/SchemaProvider.mjs +7 -4
  52. package/dist/admin/components/AIChat/providers/SchemaProvider.mjs.map +1 -1
  53. package/dist/admin/components/AttributeOptions/AttributeOption.js +2 -2
  54. package/dist/admin/components/AttributeOptions/AttributeOption.js.map +1 -1
  55. package/dist/admin/components/AttributeOptions/AttributeOption.mjs +2 -2
  56. package/dist/admin/components/AttributeOptions/AttributeOption.mjs.map +1 -1
  57. package/dist/admin/components/ContentTypeBuilderNav/lib/buildFolderTree.js.map +1 -1
  58. package/dist/admin/components/ContentTypeBuilderNav/lib/buildFolderTree.mjs.map +1 -1
  59. package/dist/admin/components/ContentTypeBuilderNav/lib/dropProjection.js.map +1 -1
  60. package/dist/admin/components/ContentTypeBuilderNav/lib/dropProjection.mjs.map +1 -1
  61. package/dist/admin/components/CustomRadioGroup/CustomRadioGroup.js +2 -1
  62. package/dist/admin/components/CustomRadioGroup/CustomRadioGroup.js.map +1 -1
  63. package/dist/admin/components/CustomRadioGroup/CustomRadioGroup.mjs +2 -1
  64. package/dist/admin/components/CustomRadioGroup/CustomRadioGroup.mjs.map +1 -1
  65. package/dist/admin/components/DataManager/DataManagerProvider.js +317 -275
  66. package/dist/admin/components/DataManager/DataManagerProvider.js.map +1 -1
  67. package/dist/admin/components/DataManager/DataManagerProvider.mjs +319 -277
  68. package/dist/admin/components/DataManager/DataManagerProvider.mjs.map +1 -1
  69. package/dist/admin/components/DataManager/RenameMigrationModal.js.map +1 -1
  70. package/dist/admin/components/DataManager/RenameMigrationModal.mjs.map +1 -1
  71. package/dist/admin/components/DataManager/reducer.js +31 -4
  72. package/dist/admin/components/DataManager/reducer.js.map +1 -1
  73. package/dist/admin/components/DataManager/reducer.mjs +31 -4
  74. package/dist/admin/components/DataManager/reducer.mjs.map +1 -1
  75. package/dist/admin/components/DynamicZoneList.js +2 -1
  76. package/dist/admin/components/DynamicZoneList.js.map +1 -1
  77. package/dist/admin/components/DynamicZoneList.mjs +2 -1
  78. package/dist/admin/components/DynamicZoneList.mjs.map +1 -1
  79. package/dist/admin/components/FormModal/attributes/ConditionForm.js +2 -1
  80. package/dist/admin/components/FormModal/attributes/ConditionForm.js.map +1 -1
  81. package/dist/admin/components/FormModal/attributes/ConditionForm.mjs +2 -1
  82. package/dist/admin/components/FormModal/attributes/ConditionForm.mjs.map +1 -1
  83. package/dist/admin/components/FormModal/attributes/types.js +2 -2
  84. package/dist/admin/components/FormModal/attributes/types.js.map +1 -1
  85. package/dist/admin/components/FormModal/attributes/types.mjs +2 -2
  86. package/dist/admin/components/FormModal/attributes/types.mjs.map +1 -1
  87. package/dist/admin/components/FormModal/forms/forms.js +1 -1
  88. package/dist/admin/components/FormModal/forms/forms.js.map +1 -1
  89. package/dist/admin/components/FormModal/forms/forms.mjs +1 -1
  90. package/dist/admin/components/FormModal/forms/forms.mjs.map +1 -1
  91. package/dist/admin/components/GenericInputs.js +2 -1
  92. package/dist/admin/components/GenericInputs.js.map +1 -1
  93. package/dist/admin/components/GenericInputs.mjs +2 -1
  94. package/dist/admin/components/GenericInputs.mjs.map +1 -1
  95. package/dist/admin/components/TabForm.js.map +1 -1
  96. package/dist/admin/components/TabForm.mjs.map +1 -1
  97. package/dist/admin/src/components/AIChat/components/FullScreenImage.d.ts +8 -0
  98. package/dist/admin/src/components/AIChat/components/Messages/Message.d.ts +20 -0
  99. package/dist/admin/utils/folderTelemetry.js.map +1 -1
  100. package/dist/admin/utils/folderTelemetry.mjs.map +1 -1
  101. package/dist/admin/utils/formAPI.js.map +1 -1
  102. package/dist/admin/utils/formAPI.mjs.map +1 -1
  103. package/dist/server/controllers/validation/schema.js +3 -2
  104. package/dist/server/controllers/validation/schema.js.map +1 -1
  105. package/dist/server/controllers/validation/schema.mjs +4 -3
  106. package/dist/server/controllers/validation/schema.mjs.map +1 -1
  107. package/dist/server/register.js.map +1 -1
  108. package/dist/server/register.mjs.map +1 -1
  109. package/dist/server/services/migration-builder/index.js.map +1 -1
  110. package/dist/server/services/migration-builder/index.mjs.map +1 -1
  111. package/dist/server/services/schema.js +34 -1
  112. package/dist/server/services/schema.js.map +1 -1
  113. package/dist/server/services/schema.mjs +34 -1
  114. package/dist/server/services/schema.mjs.map +1 -1
  115. package/dist/server/src/controllers/validation/schema.d.ts.map +1 -1
  116. package/dist/server/src/register.d.ts.map +1 -1
  117. package/dist/server/src/services/migration-builder/index.d.ts.map +1 -1
  118. package/dist/server/src/services/schema-builder/types.d.ts.map +1 -1
  119. package/dist/server/src/services/schema.d.ts.map +1 -1
  120. package/dist/server/src/utils/uid-target.d.ts +18 -0
  121. package/dist/server/src/utils/uid-target.d.ts.map +1 -0
  122. package/dist/server/utils/uid-target.js +34 -0
  123. package/dist/server/utils/uid-target.js.map +1 -0
  124. package/dist/server/utils/uid-target.mjs +31 -0
  125. package/dist/server/utils/uid-target.mjs.map +1 -0
  126. package/package.json +6 -6
@@ -17,9 +17,9 @@ import { useCTBTracking } from '../CTBSession/useCTBTracking.mjs';
17
17
  import { useFormModalNavigation } from '../FormModalNavigation/useFormModalNavigation.mjs';
18
18
  import { DataManagerContext } from './DataManagerContext.mjs';
19
19
  import { initialState, actions } from './reducer.mjs';
20
- import { RenameMigrationModal, toPendingRename, filterRenamesByAcceptedChains, shouldPromptForRenamesBeforeSave, collectPendingRenames, applyRenameDecisions } from './RenameMigrationModal.mjs';
20
+ import { shouldPromptForRenamesBeforeSave, collectPendingRenames, applyRenameDecisions, toPendingRename, filterRenamesByAcceptedChains, RenameMigrationModal } from './RenameMigrationModal.mjs';
21
21
  import { useServerRestartWatcher } from './useServerRestartWatcher.mjs';
22
- import { sortContentType, stateToRequestData } from './utils/cleanData.mjs';
22
+ import { stateToRequestData, sortContentType } from './utils/cleanData.mjs';
23
23
  import { fromServerFile, generateGroupId } from './utils/contentStructure.mjs';
24
24
  import { groupRenameChains } from './utils/groupRenameChains.mjs';
25
25
  import { resolveAfterEditRenameConsent } from './utils/resolveAfterEditRenameConsent.mjs';
@@ -183,10 +183,12 @@ const DataManagerProvider = ({ children })=>{
183
183
  const appNestedCompo = retrieveNestedComponents(components);
184
184
  return appNestedCompo;
185
185
  };
186
- const updatePermissions = async ()=>{
186
+ const updatePermissions = React.useCallback(async ()=>{
187
187
  await refetchPermissions();
188
- };
189
- const requestRenameDecision = async (renames)=>{
188
+ }, [
189
+ refetchPermissions
190
+ ]);
191
+ const requestRenameDecision = React.useCallback(async (renames)=>{
190
192
  const acceptedKeys = await new Promise((resolve)=>{
191
193
  setRenameModal({
192
194
  renames,
@@ -195,8 +197,8 @@ const DataManagerProvider = ({ children })=>{
195
197
  });
196
198
  setRenameModal(null);
197
199
  return acceptedKeys;
198
- };
199
- const saveSchema = async ()=>{
200
+ }, []);
201
+ const saveSchema = React.useCallback(async ()=>{
200
202
  setIsSaving(true);
201
203
  const PluginForms = plugin?.apis?.forms;
202
204
  const mutatedCTs = Object.entries(state.current.contentTypes).reduce((acc, [uid, contentType])=>{
@@ -281,7 +283,24 @@ const DataManagerProvider = ({ children })=>{
281
283
  ctbSessionId
282
284
  });
283
285
  }
284
- };
286
+ }, [
287
+ ctbSessionId,
288
+ dispatch,
289
+ dispatchGuidedTour,
290
+ fetchClient,
291
+ formatMessage,
292
+ initialContentTypes,
293
+ lockAppWithAutoreload,
294
+ plugin,
295
+ regenerateSessionId,
296
+ requestRenameDecision,
297
+ serverRestartWatcher,
298
+ state,
299
+ toggleNotification,
300
+ trackUsage,
301
+ unlockAppWithAutoreload,
302
+ updatePermissions
303
+ ]);
285
304
  const componentsThatHaveOtherComponentInTheirAttributes = React.useMemo(()=>{
286
305
  return getAllComponentsThatHaveAComponentInTheirAttributes(components);
287
306
  }, [
@@ -309,284 +328,307 @@ const DataManagerProvider = ({ children })=>{
309
328
  }, [
310
329
  contentTypes
311
330
  ]);
312
- const context = {
313
- componentsThatHaveOtherComponentInTheirAttributes,
314
- nestedComponents,
315
- saveSchema,
316
- reservedNames,
317
- components,
318
- contentTypes,
319
- initialComponents,
320
- initialContentTypes,
321
- contentStructure,
322
- isSaving,
323
- isModified,
324
- isInDevelopmentMode,
325
- allComponentsCategories,
326
- componentsGroupedByCategory,
327
- sortedContentTypesList,
328
- isLoading,
329
- attributeRenameMigrationMode: renameMigrationModeRef.current,
330
- addAttribute (payload) {
331
- dispatch(actions.addAttribute({
332
- ...payload,
333
- attributeToSet: payload.attributeToSet
334
- }));
335
- },
336
- editAttribute (payload) {
337
- dispatch(actions.editAttribute({
338
- ...payload,
339
- attributeToSet: payload.attributeToSet
340
- }));
341
- },
342
- addCustomFieldAttribute (payload) {
343
- dispatch(actions.addCustomFieldAttribute({
344
- ...payload,
345
- attributeToSet: payload.attributeToSet
346
- }));
347
- },
348
- editCustomFieldAttribute (payload) {
349
- dispatch(actions.editCustomFieldAttribute({
350
- ...payload,
351
- attributeToSet: payload.attributeToSet
352
- }));
353
- },
354
- async confirmAttributeRenameMigration ({ forTarget, uid, oldName, newName }) {
355
- if (oldName === newName) {
356
- return true;
357
- }
358
- const schema = forTarget === 'contentType' ? contentTypes[uid] : components[uid];
359
- // A field that was never saved has no data to preserve: accept without
360
- // prompting so neither name ends up in `declinedRenameNames`.
361
- const initialAttribute = schema?.attributes.find((attribute)=>attribute.name === oldName);
362
- if (initialAttribute?.status === 'NEW') {
363
- return true;
364
- }
365
- // Consent inherits along a chain: a hop joining an accepted chain is
366
- // accepted, one touching a declined name is declined, neither prompts.
367
- const consent = resolveAfterEditRenameConsent({
368
- renames: schema?.renames ?? [],
369
- declinedRenameNames: schema?.declinedRenameNames ?? [],
370
- oldName,
371
- newName,
372
- mode: renameMigrationModeRef.current
373
- });
374
- if (consent !== 'prompt') {
375
- return consent === 'accept';
376
- }
377
- const key = `${uid}:edit`;
378
- const acceptedKeys = await requestRenameDecision([
379
- {
380
- key,
381
- uid,
382
- typeName: schema?.info.displayName ?? uid,
383
- pairs: [
384
- {
385
- oldName,
386
- newName
387
- }
388
- ],
389
- via: []
331
+ const context = React.useMemo(()=>({
332
+ componentsThatHaveOtherComponentInTheirAttributes,
333
+ nestedComponents,
334
+ saveSchema,
335
+ reservedNames,
336
+ components,
337
+ contentTypes,
338
+ initialComponents,
339
+ initialContentTypes,
340
+ contentStructure,
341
+ isSaving,
342
+ isModified,
343
+ isInDevelopmentMode,
344
+ allComponentsCategories,
345
+ componentsGroupedByCategory,
346
+ sortedContentTypesList,
347
+ isLoading,
348
+ attributeRenameMigrationMode: renameMigrationModeRef.current,
349
+ addAttribute (payload) {
350
+ dispatch(actions.addAttribute({
351
+ ...payload,
352
+ attributeToSet: payload.attributeToSet
353
+ }));
354
+ },
355
+ editAttribute (payload) {
356
+ dispatch(actions.editAttribute({
357
+ ...payload,
358
+ attributeToSet: payload.attributeToSet
359
+ }));
360
+ },
361
+ addCustomFieldAttribute (payload) {
362
+ dispatch(actions.addCustomFieldAttribute({
363
+ ...payload,
364
+ attributeToSet: payload.attributeToSet
365
+ }));
366
+ },
367
+ editCustomFieldAttribute (payload) {
368
+ dispatch(actions.editCustomFieldAttribute({
369
+ ...payload,
370
+ attributeToSet: payload.attributeToSet
371
+ }));
372
+ },
373
+ async confirmAttributeRenameMigration ({ forTarget, uid, oldName, newName }) {
374
+ if (oldName === newName) {
375
+ return true;
390
376
  }
391
- ]);
392
- if (acceptedKeys === null) {
393
- return null;
394
- }
395
- return acceptedKeys.has(key);
396
- },
397
- addCreatedComponentToDynamicZone (payload) {
398
- dispatch(actions.addCreatedComponentToDynamicZone(payload));
399
- },
400
- createSchema (payload) {
401
- const { folder, ...rest } = payload;
402
- dispatch(actions.createSchema({
403
- ...rest,
404
- folder: toFolderAssignment(folder)
405
- }));
406
- },
407
- createComponentSchema ({ data, uid, componentCategory }) {
408
- dispatch(actions.createComponentSchema({
409
- data,
410
- uid,
411
- componentCategory
412
- }));
413
- },
414
- changeDynamicZoneComponents ({ forTarget, targetUid, dynamicZoneTarget, newComponents }) {
415
- dispatch(actions.changeDynamicZoneComponents({
416
- forTarget,
417
- targetUid,
418
- dynamicZoneTarget,
419
- newComponents
420
- }));
421
- },
422
- removeAttribute (payload) {
423
- if (payload.forTarget === 'contentType') {
424
- // Note: willDeleteFieldOfContentType doesn't accept properties
425
- trackUsage('willDeleteFieldOfContentType');
426
- }
427
- dispatch(actions.removeField(payload));
428
- },
429
- removeComponentFromDynamicZone (payload) {
430
- dispatch(actions.removeComponentFromDynamicZone(payload));
431
- },
432
- deleteComponent (uid) {
433
- const userConfirm = window.confirm(formatMessage({
434
- id: getTrad(`popUpWarning.bodyMessage.component.delete`)
435
- }));
436
- if (userConfirm) {
437
- onCloseModal();
438
- dispatch(actions.deleteComponent(uid));
439
- }
440
- },
441
- deleteContentType (uid) {
442
- const userConfirm = window.confirm(formatMessage({
443
- id: getTrad(`popUpWarning.bodyMessage.contentType.delete`)
444
- }));
445
- if (userConfirm) {
446
- onCloseModal();
447
- dispatch(actions.deleteContentType(uid));
448
- }
449
- },
450
- createFolder ({ section, name, parentId }) {
451
- dispatch(actions.createFolder({
452
- section,
453
- name,
454
- parentId,
455
- id: generateGroupId()
456
- }));
457
- },
458
- renameFolder (payload) {
459
- dispatch(actions.renameFolder(payload));
460
- },
461
- moveFolder (payload) {
462
- dispatch(actions.moveFolder(payload));
463
- },
464
- deleteFolderOnly (payload) {
465
- dispatch(actions.deleteFolderOnly(payload));
466
- },
467
- deleteFolderAndContent ({ section, id, contentTypeUids }) {
468
- dispatch(actions.deleteFolderAndContent({
469
- section,
470
- id,
471
- contentTypeUids
472
- }));
473
- },
474
- assignContentTypeToFolder (payload) {
475
- dispatch(actions.assignContentTypeToFolder(payload));
476
- },
477
- reorderFolderChildren (payload) {
478
- dispatch(actions.reorderFolderChildren(payload));
479
- },
480
- updateComponentSchema ({ data, componentUID }) {
481
- dispatch(actions.updateComponentSchema({
482
- data,
483
- uid: componentUID
484
- }));
485
- },
486
- updateComponentUid ({ componentUID, newComponentUID }) {
487
- dispatch(actions.updateComponentUid({
488
- uid: componentUID,
489
- newComponentUID
490
- }));
491
- },
492
- updateSchema (args) {
493
- const { folder, ...rest } = args;
494
- dispatch(actions.updateSchema({
495
- ...rest,
496
- folder: toFolderAssignment(folder)
497
- }));
498
- },
499
- moveAttribute (args) {
500
- dispatch(actions.moveAttribute(args));
501
- },
502
- async applyChange ({ action, schema }) {
503
- const renames = schema.renames ?? [];
504
- if (action !== 'update' || renames.length === 0) {
505
- dispatch(actions.applyChange({
506
- action,
507
- schema
377
+ const schema = forTarget === 'contentType' ? contentTypes[uid] : components[uid];
378
+ // A field that was never saved has no data to preserve: accept without
379
+ // prompting so neither name ends up in `declinedRenameNames`.
380
+ const initialAttribute = schema?.attributes.find((attribute)=>attribute.name === oldName);
381
+ if (initialAttribute?.status === 'NEW') {
382
+ return true;
383
+ }
384
+ // Consent inherits along a chain: a hop joining an accepted chain is
385
+ // accepted, one touching a declined name is declined, neither prompts.
386
+ const consent = resolveAfterEditRenameConsent({
387
+ renames: schema?.renames ?? [],
388
+ declinedRenameNames: schema?.declinedRenameNames ?? [],
389
+ oldName,
390
+ newName,
391
+ mode: renameMigrationModeRef.current
392
+ });
393
+ if (consent !== 'prompt') {
394
+ return consent === 'accept';
395
+ }
396
+ const key = `${uid}:edit`;
397
+ const acceptedKeys = await requestRenameDecision([
398
+ {
399
+ key,
400
+ uid,
401
+ typeName: schema?.info.displayName ?? uid,
402
+ pairs: [
403
+ {
404
+ oldName,
405
+ newName
406
+ }
407
+ ],
408
+ via: []
409
+ }
410
+ ]);
411
+ if (acceptedKeys === null) {
412
+ return null;
413
+ }
414
+ return acceptedKeys.has(key);
415
+ },
416
+ addCreatedComponentToDynamicZone (payload) {
417
+ dispatch(actions.addCreatedComponentToDynamicZone(payload));
418
+ },
419
+ createSchema (payload) {
420
+ const { folder, ...rest } = payload;
421
+ dispatch(actions.createSchema({
422
+ ...rest,
423
+ folder: toFolderAssignment(folder)
508
424
  }));
509
- return true;
510
- }
511
- const mode = renameMigrationModeRef.current;
512
- if (mode === 'never') {
513
- dispatch(actions.applyChange({
514
- action,
515
- schema: omit(schema, [
516
- 'renames'
517
- ])
425
+ },
426
+ createComponentSchema ({ data, uid, componentCategory }) {
427
+ dispatch(actions.createComponentSchema({
428
+ data,
429
+ uid,
430
+ componentCategory
518
431
  }));
519
- return true;
520
- }
521
- // 'always' | 'prompt-before-save': the before-save modal decides per chain.
522
- if (mode !== 'prompt-after-edit') {
523
- dispatch(actions.applyChange({
524
- action,
525
- schema
432
+ },
433
+ changeDynamicZoneComponents ({ forTarget, targetUid, dynamicZoneTarget, newComponents }) {
434
+ dispatch(actions.changeDynamicZoneComponents({
435
+ forTarget,
436
+ targetUid,
437
+ dynamicZoneTarget,
438
+ newComponents
526
439
  }));
527
- return true;
528
- }
529
- // 'prompt-after-edit': decide per chain now, inheriting consent already
530
- // given (or refused) for the hops recorded on the type.
531
- const existing = schema.modelType === 'contentType' ? contentTypes[schema.uid] : components[schema.uid];
532
- const chains = groupRenameChains(schema.uid, renames);
533
- const { keep, prompt } = splitChainsByInheritedConsent({
534
- recorded: existing?.renames ?? [],
535
- declinedRenameNames: existing?.declinedRenameNames ?? [],
536
- chains,
537
- renames
538
- });
539
- const accepted = new Set(keep.map((chain)=>chain.id));
540
- if (prompt.length > 0) {
541
- const typeName = schema.info?.displayName ?? schema.uid;
542
- const decision = await requestRenameDecision(prompt.map((chain)=>toPendingRename(chain, renames, {
543
- uid: schema.uid,
544
- typeName
545
- })));
546
- // The user cancelled: apply nothing.
547
- if (decision === null) {
548
- return false;
440
+ },
441
+ removeAttribute (payload) {
442
+ if (payload.forTarget === 'contentType') {
443
+ // Note: willDeleteFieldOfContentType doesn't accept properties
444
+ trackUsage('willDeleteFieldOfContentType');
549
445
  }
550
- decision.forEach((id)=>accepted.add(id));
551
- }
552
- const declinedChains = chains.filter((chain)=>!accepted.has(chain.id));
553
- const keptRenames = filterRenamesByAcceptedChains(schema.uid, renames, accepted);
554
- const declinedRenameNames = uniq([
555
- ...schema.declinedRenameNames ?? [],
556
- ...namesOfChains(declinedChains, renames)
557
- ]);
558
- dispatch(actions.applyChange({
559
- action,
560
- schema: {
561
- ...omit(schema, [
562
- 'renames',
563
- 'declinedRenameNames'
564
- ]),
565
- ...keptRenames.length > 0 ? {
566
- renames: keptRenames
567
- } : {},
568
- ...declinedRenameNames.length > 0 ? {
569
- declinedRenameNames
570
- } : {}
446
+ dispatch(actions.removeField(payload));
447
+ },
448
+ removeComponentFromDynamicZone (payload) {
449
+ dispatch(actions.removeComponentFromDynamicZone(payload));
450
+ },
451
+ deleteComponent (uid) {
452
+ const userConfirm = window.confirm(formatMessage({
453
+ id: getTrad(`popUpWarning.bodyMessage.component.delete`)
454
+ }));
455
+ if (userConfirm) {
456
+ onCloseModal();
457
+ dispatch(actions.deleteComponent(uid));
571
458
  }
572
- }));
573
- return true;
574
- },
575
- history: {
576
- undo () {
577
- dispatch(actions.undo());
578
459
  },
579
- redo () {
580
- dispatch(actions.redo());
460
+ deleteContentType (uid) {
461
+ const userConfirm = window.confirm(formatMessage({
462
+ id: getTrad(`popUpWarning.bodyMessage.contentType.delete`)
463
+ }));
464
+ if (userConfirm) {
465
+ onCloseModal();
466
+ dispatch(actions.deleteContentType(uid));
467
+ }
581
468
  },
582
- discardAllChanges () {
583
- dispatch(actions.discardAll());
469
+ createFolder ({ section, name, parentId }) {
470
+ dispatch(actions.createFolder({
471
+ section,
472
+ name,
473
+ parentId,
474
+ id: generateGroupId()
475
+ }));
584
476
  },
585
- canUndo: state.past.length > 0,
586
- canRedo: state.future.length > 0,
587
- canDiscardAll: isModified
588
- }
589
- };
477
+ renameFolder (payload) {
478
+ dispatch(actions.renameFolder(payload));
479
+ },
480
+ moveFolder (payload) {
481
+ dispatch(actions.moveFolder(payload));
482
+ },
483
+ deleteFolderOnly (payload) {
484
+ dispatch(actions.deleteFolderOnly(payload));
485
+ },
486
+ deleteFolderAndContent ({ section, id, contentTypeUids }) {
487
+ dispatch(actions.deleteFolderAndContent({
488
+ section,
489
+ id,
490
+ contentTypeUids
491
+ }));
492
+ },
493
+ assignContentTypeToFolder (payload) {
494
+ dispatch(actions.assignContentTypeToFolder(payload));
495
+ },
496
+ reorderFolderChildren (payload) {
497
+ dispatch(actions.reorderFolderChildren(payload));
498
+ },
499
+ updateComponentSchema ({ data, componentUID }) {
500
+ dispatch(actions.updateComponentSchema({
501
+ data,
502
+ uid: componentUID
503
+ }));
504
+ },
505
+ updateComponentUid ({ componentUID, newComponentUID }) {
506
+ dispatch(actions.updateComponentUid({
507
+ uid: componentUID,
508
+ newComponentUID
509
+ }));
510
+ },
511
+ updateSchema (args) {
512
+ const { folder, ...rest } = args;
513
+ dispatch(actions.updateSchema({
514
+ ...rest,
515
+ folder: toFolderAssignment(folder)
516
+ }));
517
+ },
518
+ moveAttribute (args) {
519
+ dispatch(actions.moveAttribute(args));
520
+ },
521
+ async applyChange ({ action, schema }) {
522
+ const renames = schema.renames ?? [];
523
+ if (action !== 'update' || renames.length === 0) {
524
+ dispatch(actions.applyChange({
525
+ action,
526
+ schema
527
+ }));
528
+ return true;
529
+ }
530
+ const mode = renameMigrationModeRef.current;
531
+ if (mode === 'never') {
532
+ dispatch(actions.applyChange({
533
+ action,
534
+ schema: omit(schema, [
535
+ 'renames'
536
+ ])
537
+ }));
538
+ return true;
539
+ }
540
+ // 'always' | 'prompt-before-save': the before-save modal decides per chain.
541
+ if (mode !== 'prompt-after-edit') {
542
+ dispatch(actions.applyChange({
543
+ action,
544
+ schema
545
+ }));
546
+ return true;
547
+ }
548
+ // 'prompt-after-edit': decide per chain now, inheriting consent already
549
+ // given (or refused) for the hops recorded on the type.
550
+ const existing = schema.modelType === 'contentType' ? contentTypes[schema.uid] : components[schema.uid];
551
+ const chains = groupRenameChains(schema.uid, renames);
552
+ const { keep, prompt } = splitChainsByInheritedConsent({
553
+ recorded: existing?.renames ?? [],
554
+ declinedRenameNames: existing?.declinedRenameNames ?? [],
555
+ chains,
556
+ renames
557
+ });
558
+ const accepted = new Set(keep.map((chain)=>chain.id));
559
+ if (prompt.length > 0) {
560
+ const typeName = schema.info?.displayName ?? schema.uid;
561
+ const decision = await requestRenameDecision(prompt.map((chain)=>toPendingRename(chain, renames, {
562
+ uid: schema.uid,
563
+ typeName
564
+ })));
565
+ // The user cancelled: apply nothing.
566
+ if (decision === null) {
567
+ return false;
568
+ }
569
+ decision.forEach((id)=>accepted.add(id));
570
+ }
571
+ const declinedChains = chains.filter((chain)=>!accepted.has(chain.id));
572
+ const keptRenames = filterRenamesByAcceptedChains(schema.uid, renames, accepted);
573
+ const declinedRenameNames = uniq([
574
+ ...schema.declinedRenameNames ?? [],
575
+ ...namesOfChains(declinedChains, renames)
576
+ ]);
577
+ dispatch(actions.applyChange({
578
+ action,
579
+ schema: {
580
+ ...omit(schema, [
581
+ 'renames',
582
+ 'declinedRenameNames'
583
+ ]),
584
+ ...keptRenames.length > 0 ? {
585
+ renames: keptRenames
586
+ } : {},
587
+ ...declinedRenameNames.length > 0 ? {
588
+ declinedRenameNames
589
+ } : {}
590
+ }
591
+ }));
592
+ return true;
593
+ },
594
+ history: {
595
+ undo () {
596
+ dispatch(actions.undo());
597
+ },
598
+ redo () {
599
+ dispatch(actions.redo());
600
+ },
601
+ discardAllChanges () {
602
+ dispatch(actions.discardAll());
603
+ },
604
+ canUndo: state.past.length > 0,
605
+ canRedo: state.future.length > 0,
606
+ canDiscardAll: isModified
607
+ }
608
+ }), [
609
+ allComponentsCategories,
610
+ components,
611
+ componentsGroupedByCategory,
612
+ componentsThatHaveOtherComponentInTheirAttributes,
613
+ contentStructure,
614
+ contentTypes,
615
+ dispatch,
616
+ formatMessage,
617
+ initialComponents,
618
+ initialContentTypes,
619
+ isInDevelopmentMode,
620
+ isLoading,
621
+ isModified,
622
+ isSaving,
623
+ nestedComponents,
624
+ onCloseModal,
625
+ requestRenameDecision,
626
+ reservedNames,
627
+ saveSchema,
628
+ sortedContentTypesList,
629
+ state,
630
+ trackUsage
631
+ ]);
590
632
  return /*#__PURE__*/ jsxs(DataManagerContext.Provider, {
591
633
  value: context,
592
634
  children: [