@strapi/content-manager 5.50.1 → 5.51.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 (66) hide show
  1. package/dist/admin/content-manager.js +31 -4
  2. package/dist/admin/content-manager.js.map +1 -1
  3. package/dist/admin/content-manager.mjs +31 -4
  4. package/dist/admin/content-manager.mjs.map +1 -1
  5. package/dist/admin/index.js +1 -1
  6. package/dist/admin/index.js.map +1 -1
  7. package/dist/admin/index.mjs +1 -1
  8. package/dist/admin/index.mjs.map +1 -1
  9. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js +29 -9
  10. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
  11. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs +29 -9
  12. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs.map +1 -1
  13. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js +5 -13
  14. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
  15. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs +5 -13
  16. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs.map +1 -1
  17. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +4 -1
  18. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  19. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +4 -1
  20. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  21. package/dist/admin/pages/EditView/utils/draftRelationCounts.js +14 -7
  22. package/dist/admin/pages/EditView/utils/draftRelationCounts.js.map +1 -1
  23. package/dist/admin/pages/EditView/utils/draftRelationCounts.mjs +14 -8
  24. package/dist/admin/pages/EditView/utils/draftRelationCounts.mjs.map +1 -1
  25. package/dist/admin/preview/components/PreviewSidePanel.js +46 -9
  26. package/dist/admin/preview/components/PreviewSidePanel.js.map +1 -1
  27. package/dist/admin/preview/components/PreviewSidePanel.mjs +27 -10
  28. package/dist/admin/preview/components/PreviewSidePanel.mjs.map +1 -1
  29. package/dist/admin/src/content-manager.d.ts +1 -1
  30. package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
  31. package/dist/admin/src/index.d.ts +1 -1
  32. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/plugins/withStrapiSchema.d.ts +1 -1
  33. package/dist/admin/src/pages/EditView/components/FormInputs/Relations/Relations.d.ts +9 -1
  34. package/dist/admin/src/pages/EditView/utils/draftRelationCounts.d.ts +1 -0
  35. package/dist/admin/src/services/documents.d.ts +5 -5
  36. package/dist/admin/src/services/uid.d.ts +2 -2
  37. package/dist/admin/translations/ko.json.js +180 -1
  38. package/dist/admin/translations/ko.json.js.map +1 -1
  39. package/dist/admin/translations/ko.json.mjs +180 -1
  40. package/dist/admin/translations/ko.json.mjs.map +1 -1
  41. package/dist/server/src/controllers/index.d.ts +1 -1
  42. package/dist/server/src/controllers/utils/metadata.d.ts +1 -1
  43. package/dist/server/src/history/routes/index.d.ts +3 -1
  44. package/dist/server/src/history/routes/index.d.ts.map +1 -1
  45. package/dist/server/src/history/services/index.d.ts +3 -3
  46. package/dist/server/src/homepage/index.d.ts +7 -3
  47. package/dist/server/src/homepage/index.d.ts.map +1 -1
  48. package/dist/server/src/homepage/routes/index.d.ts +3 -1
  49. package/dist/server/src/homepage/routes/index.d.ts.map +1 -1
  50. package/dist/server/src/homepage/services/index.d.ts +1 -1
  51. package/dist/server/src/index.d.ts +69 -67
  52. package/dist/server/src/index.d.ts.map +1 -1
  53. package/dist/server/src/preview/routes/index.d.ts +3 -1
  54. package/dist/server/src/preview/routes/index.d.ts.map +1 -1
  55. package/dist/server/src/preview/services/index.d.ts +4 -4
  56. package/dist/server/src/preview/services/index.d.ts.map +1 -1
  57. package/dist/server/src/routes/index.d.ts +3 -1
  58. package/dist/server/src/routes/index.d.ts.map +1 -1
  59. package/dist/server/src/services/data-mapper.d.ts +1 -1
  60. package/dist/server/src/services/index.d.ts +63 -63
  61. package/dist/server/src/services/populate-builder.d.ts +1 -1
  62. package/dist/server/src/utils/index.d.ts +2 -2
  63. package/dist/server/src/utils/index.d.ts.map +1 -1
  64. package/dist/server/utils/index.js.map +1 -1
  65. package/dist/server/utils/index.mjs.map +1 -1
  66. package/package.json +15 -11
@@ -30,48 +30,60 @@ var TableActions = require('./pages/ListView/components/TableActions.js');
30
30
  }
31
31
  addEditViewSidePanel(panels) {
32
32
  if (Array.isArray(panels)) {
33
+ validateDescriptionItems(panels, 'addEditViewSidePanel', 'panels');
33
34
  this.editViewSidePanels = [
34
35
  ...this.editViewSidePanels,
35
36
  ...panels
36
37
  ];
37
38
  } else if (typeof panels === 'function') {
38
- this.editViewSidePanels = panels(this.editViewSidePanels);
39
+ const result = panels(this.editViewSidePanels);
40
+ validateDescriptionItems(result, 'addEditViewSidePanel', 'panels');
41
+ this.editViewSidePanels = result;
39
42
  } else {
40
43
  throw new Error(`Expected the \`panels\` passed to \`addEditViewSidePanel\` to be an array or a function, but received ${getPrintableType(panels)}`);
41
44
  }
42
45
  }
43
46
  addDocumentAction(actions) {
44
47
  if (Array.isArray(actions)) {
48
+ validateDescriptionItems(actions, 'addDocumentAction', 'actions');
45
49
  this.documentActions = [
46
50
  ...this.documentActions,
47
51
  ...actions
48
52
  ];
49
53
  } else if (typeof actions === 'function') {
50
- this.documentActions = actions(this.documentActions);
54
+ const result = actions(this.documentActions);
55
+ validateDescriptionItems(result, 'addDocumentAction', 'actions');
56
+ this.documentActions = result;
51
57
  } else {
52
58
  throw new Error(`Expected the \`actions\` passed to \`addDocumentAction\` to be an array or a function, but received ${getPrintableType(actions)}`);
53
59
  }
54
60
  }
55
61
  addDocumentHeaderAction(actions) {
56
62
  if (Array.isArray(actions)) {
63
+ validateDescriptionItems(actions, 'addDocumentHeaderAction', 'actions');
57
64
  this.headerActions = [
58
65
  ...this.headerActions,
59
66
  ...actions
60
67
  ];
61
68
  } else if (typeof actions === 'function') {
62
- this.headerActions = actions(this.headerActions);
69
+ const result = actions(this.headerActions);
70
+ validateDescriptionItems(result, 'addDocumentHeaderAction', 'actions');
71
+ this.headerActions = result;
63
72
  } else {
64
73
  throw new Error(`Expected the \`actions\` passed to \`addDocumentHeaderAction\` to be an array or a function, but received ${getPrintableType(actions)}`);
65
74
  }
66
75
  }
67
76
  addBulkAction(actions) {
68
77
  if (Array.isArray(actions)) {
78
+ validateDescriptionItems(actions, 'addBulkAction', 'actions');
69
79
  this.bulkActions = [
70
80
  ...this.bulkActions,
71
81
  ...actions
72
82
  ];
73
83
  } else if (typeof actions === 'function') {
74
- this.bulkActions = actions(this.bulkActions);
84
+ const result = actions(this.bulkActions);
85
+ validateDescriptionItems(result, 'addBulkAction', 'actions');
86
+ this.bulkActions = result;
75
87
  } else {
76
88
  throw new Error(`Expected the \`actions\` passed to \`addBulkAction\` to be an array or a function, but received ${getPrintableType(actions)}`);
77
89
  }
@@ -152,6 +164,21 @@ var TableActions = require('./pages/ListView/components/TableActions.js');
152
164
  }
153
165
  return nativeType;
154
166
  };
167
+ /* -------------------------------------------------------------------------------------------------
168
+ * validateDescriptionItems
169
+ * -----------------------------------------------------------------------------------------------*/ /**
170
+ * @internal
171
+ * @description Descriptions must be functions (they're rendered as components so hooks can be used
172
+ * inside them), not plain objects. Passing a plain object crashes deep inside
173
+ * `DescriptionComponentRenderer` with an unhelpful `description is not a function` error, so we
174
+ * validate eagerly here to fail fast with a clear message pointing at the offending API call.
175
+ */ const validateDescriptionItems = (items, apiName, argName)=>{
176
+ items.forEach((item, index)=>{
177
+ if (typeof item !== 'function') {
178
+ throw new Error(`Expected every item in the \`${argName}\` array passed to \`${apiName}\` to be a function that returns a description object, but received ${getPrintableType(item)} at index ${index}. Did you forget to wrap it in a function, e.g. \`() => ({ ...yourAction })\`?`);
179
+ }
180
+ });
181
+ };
155
182
 
156
183
  exports.ContentManagerPlugin = ContentManagerPlugin;
157
184
  //# sourceMappingURL=content-manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"content-manager.js","sources":["../../admin/src/content-manager.ts"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\n\nimport { INJECTION_ZONES } from './components/InjectionZone';\nimport { PLUGIN_ID } from './constants/plugin';\nimport {\n DEFAULT_ACTIONS,\n type DocumentActionPosition,\n type DocumentActionDescription,\n} from './pages/EditView/components/DocumentActions';\nimport { RichTextBlocksStore } from './pages/EditView/components/FormInputs/BlocksInput/BlocksEditor';\nimport { defaultBlocksStore } from './pages/EditView/components/FormInputs/BlocksInput/DefaultBlocksStore';\nimport {\n DEFAULT_HEADER_ACTIONS,\n type HeaderActionDescription,\n} from './pages/EditView/components/Header';\nimport { ActionsPanel, type PanelDescription } from './pages/EditView/components/Panels';\nimport {\n DEFAULT_BULK_ACTIONS,\n type BulkActionDescription,\n} from './pages/ListView/components/BulkActions/Actions';\nimport { DEFAULT_TABLE_ROW_ACTIONS } from './pages/ListView/components/TableActions';\n\nimport type { Document } from './hooks/useDocument';\nimport type { DocumentMetadata } from '../../shared/contracts/collection-types';\nimport type { DescriptionComponent, PluginConfig } from '@strapi/admin/strapi-admin';\n\n/* -------------------------------------------------------------------------------------------------\n * Configuration Types\n * -----------------------------------------------------------------------------------------------*/\n\ntype DescriptionReducer<Config extends object> = (prev: Config[]) => Config[];\ntype DescriptionObjReducer<Config extends object> = (prev: Config) => Config;\n\ninterface EditViewContext {\n /**\n * This will ONLY be null, if the content-type\n * does not have draft & published enabled.\n */\n activeTab: 'draft' | 'published' | null;\n /**\n * Will be either 'single-types' | 'collection-types'\n */\n collectionType: string;\n /**\n * this will be undefined if someone is creating an entry.\n */\n document?: Document;\n /**\n * this will be undefined if someone is creating an entry.\n */\n documentId?: string;\n /**\n * this will be undefined if someone is creating an entry.\n */\n meta?: DocumentMetadata;\n /**\n * The current content-type's model.\n */\n model: string;\n}\n\ninterface ListViewContext {\n /**\n * Will be either 'single-types' | 'collection-types'\n */\n collectionType: string;\n /**\n * The current selected documents in the table\n */\n documents: Document[];\n /**\n * The current content-type's model.\n */\n model: string;\n}\n\ninterface PanelComponentProps extends EditViewContext {}\n\ninterface PanelComponent extends DescriptionComponent<PanelComponentProps, PanelDescription> {\n /**\n * The defaults are added by Strapi only, if you're providing your own component,\n * you do not need to provide this.\n */\n type?: 'actions' | 'releases';\n}\n\ninterface DocumentActionProps extends EditViewContext {}\n\ninterface DocumentActionComponent\n extends DescriptionComponent<DocumentActionProps, DocumentActionDescription> {\n type?:\n | 'clone'\n | 'configure-the-view'\n | 'delete'\n | 'discard'\n | 'edit'\n | 'edit-the-model'\n | 'history'\n | 'publish'\n | 'unpublish'\n | 'update';\n position?: DocumentActionDescription['position'];\n}\n\ninterface HeaderActionProps extends EditViewContext {}\n\ninterface HeaderActionComponent\n extends DescriptionComponent<HeaderActionProps, HeaderActionDescription> {}\n\ninterface BulkActionComponentProps extends ListViewContext {}\n\ninterface BulkActionComponent\n extends DescriptionComponent<BulkActionComponentProps, BulkActionDescription> {\n type?: 'delete' | 'publish' | 'unpublish';\n}\n\n/* -------------------------------------------------------------------------------------------------\n * ContentManager plugin\n * -----------------------------------------------------------------------------------------------*/\n\nclass ContentManagerPlugin {\n /**\n * The following properties are the stored ones provided by any plugins registering with\n * the content-manager. The function calls however, need to be called at runtime in the\n * application, so instead we collate them and run them later with the complete list incl.\n * ones already registered & the context of the view.\n */\n richTextBlocksStore: RichTextBlocksStore = { ...defaultBlocksStore };\n bulkActions: BulkActionComponent[] = [...DEFAULT_BULK_ACTIONS];\n documentActions: DocumentActionComponent[] = [\n ...DEFAULT_ACTIONS,\n ...DEFAULT_TABLE_ROW_ACTIONS,\n ...DEFAULT_HEADER_ACTIONS,\n ];\n editViewSidePanels: PanelComponent[] = [ActionsPanel];\n headerActions: HeaderActionComponent[] = [];\n\n constructor() {}\n\n addRichTextBlocks(blocks: RichTextBlocksStore): void;\n addRichTextBlocks(blocks: DescriptionObjReducer<RichTextBlocksStore>): void;\n addRichTextBlocks(blocks: RichTextBlocksStore | DescriptionObjReducer<RichTextBlocksStore>) {\n if (typeof blocks === 'function') {\n const result = blocks(this.richTextBlocksStore);\n if (typeof result !== 'object' || result === null) {\n throw new Error(\n `Expected the \\`blocks\\` passed to \\`addRichTextBlocks\\` to be an object or a function, but received ${getPrintableType(result)}`\n );\n }\n this.richTextBlocksStore = result;\n } else if (typeof blocks === 'object') {\n this.richTextBlocksStore = { ...this.richTextBlocksStore, ...blocks };\n } else {\n throw new Error(\n `Expected the \\`blocks\\` passed to \\`addRichTextBlocks\\` to be an object or a function, but received ${getPrintableType(\n blocks\n )}`\n );\n }\n }\n\n addEditViewSidePanel(panels: DescriptionReducer<PanelComponent>): void;\n addEditViewSidePanel(panels: PanelComponent[]): void;\n addEditViewSidePanel(panels: DescriptionReducer<PanelComponent> | PanelComponent[]) {\n if (Array.isArray(panels)) {\n this.editViewSidePanels = [...this.editViewSidePanels, ...panels];\n } else if (typeof panels === 'function') {\n this.editViewSidePanels = panels(this.editViewSidePanels);\n } else {\n throw new Error(\n `Expected the \\`panels\\` passed to \\`addEditViewSidePanel\\` to be an array or a function, but received ${getPrintableType(\n panels\n )}`\n );\n }\n }\n\n addDocumentAction(actions: DescriptionReducer<DocumentActionComponent>): void;\n addDocumentAction(actions: DocumentActionComponent[]): void;\n addDocumentAction(\n actions: DescriptionReducer<DocumentActionComponent> | DocumentActionComponent[]\n ) {\n if (Array.isArray(actions)) {\n this.documentActions = [...this.documentActions, ...actions];\n } else if (typeof actions === 'function') {\n this.documentActions = actions(this.documentActions);\n } else {\n throw new Error(\n `Expected the \\`actions\\` passed to \\`addDocumentAction\\` to be an array or a function, but received ${getPrintableType(\n actions\n )}`\n );\n }\n }\n\n addDocumentHeaderAction(actions: DescriptionReducer<HeaderActionComponent>): void;\n addDocumentHeaderAction(actions: HeaderActionComponent[]): void;\n addDocumentHeaderAction(\n actions: DescriptionReducer<HeaderActionComponent> | HeaderActionComponent[]\n ) {\n if (Array.isArray(actions)) {\n this.headerActions = [...this.headerActions, ...actions];\n } else if (typeof actions === 'function') {\n this.headerActions = actions(this.headerActions);\n } else {\n throw new Error(\n `Expected the \\`actions\\` passed to \\`addDocumentHeaderAction\\` to be an array or a function, but received ${getPrintableType(\n actions\n )}`\n );\n }\n }\n\n addBulkAction(actions: DescriptionReducer<BulkActionComponent>): void;\n addBulkAction(actions: BulkActionComponent[]): void;\n addBulkAction(actions: DescriptionReducer<BulkActionComponent> | BulkActionComponent[]) {\n if (Array.isArray(actions)) {\n this.bulkActions = [...this.bulkActions, ...actions];\n } else if (typeof actions === 'function') {\n this.bulkActions = actions(this.bulkActions);\n } else {\n throw new Error(\n `Expected the \\`actions\\` passed to \\`addBulkAction\\` to be an array or a function, but received ${getPrintableType(\n actions\n )}`\n );\n }\n }\n\n get config() {\n return {\n id: PLUGIN_ID,\n name: 'Content Manager',\n injectionZones: INJECTION_ZONES,\n apis: {\n addBulkAction: this.addBulkAction.bind(this),\n addDocumentAction: this.addDocumentAction.bind(this),\n addDocumentHeaderAction: this.addDocumentHeaderAction.bind(this),\n addEditViewSidePanel: this.addEditViewSidePanel.bind(this),\n addRichTextBlocks: this.addRichTextBlocks.bind(this),\n getBulkActions: () => this.bulkActions,\n getDocumentActions: (position?: DocumentActionPosition) => {\n /**\n * When possible, pre-filter the actions by the components static position property.\n * This avoids rendering the actions in multiple places where they weren't displayed,\n * which wasn't visible but created issues with useEffect for instance.\n * The response should still be filtered by the position, as the static property is new\n * and not mandatory to avoid a breaking change.\n */\n if (position) {\n return this.documentActions.filter((action) => {\n return action.position == undefined || [action.position].flat().includes(position);\n });\n }\n\n return this.documentActions;\n },\n getEditViewSidePanels: () => this.editViewSidePanels,\n getHeaderActions: () => this.headerActions,\n getRichTextBlocks: () => ({ ...this.richTextBlocksStore }),\n },\n } satisfies PluginConfig;\n }\n}\n\n/* -------------------------------------------------------------------------------------------------\n * getPrintableType\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal\n * @description Gets the human-friendly printable type name for the given value, for instance it will yield\n * `array` instead of `object`, as the native `typeof` operator would do.\n */\nconst getPrintableType = (value: unknown): string => {\n const nativeType = typeof value;\n\n if (nativeType === 'object') {\n if (value === null) return 'null';\n if (Array.isArray(value)) return 'array';\n if (value instanceof Object && value.constructor.name !== 'Object') {\n return value.constructor.name;\n }\n }\n\n return nativeType;\n};\n\nexport { ContentManagerPlugin };\nexport type {\n EditViewContext,\n ListViewContext,\n BulkActionComponent,\n BulkActionComponentProps,\n BulkActionDescription,\n DescriptionComponent,\n DescriptionReducer,\n PanelComponentProps,\n PanelComponent,\n PanelDescription,\n DocumentActionComponent,\n DocumentActionDescription,\n DocumentActionProps,\n HeaderActionComponent,\n HeaderActionDescription,\n HeaderActionProps,\n};\n"],"names":["ContentManagerPlugin","addRichTextBlocks","blocks","result","richTextBlocksStore","Error","getPrintableType","addEditViewSidePanel","panels","Array","isArray","editViewSidePanels","addDocumentAction","actions","documentActions","addDocumentHeaderAction","headerActions","addBulkAction","bulkActions","config","id","PLUGIN_ID","name","injectionZones","INJECTION_ZONES","apis","bind","getBulkActions","getDocumentActions","position","filter","action","undefined","flat","includes","getEditViewSidePanels","getHeaderActions","getRichTextBlocks","defaultBlocksStore","DEFAULT_BULK_ACTIONS","DEFAULT_ACTIONS","DEFAULT_TABLE_ROW_ACTIONS","DEFAULT_HEADER_ACTIONS","ActionsPanel","value","nativeType","Object"],"mappings":";;;;;;;;;;;AAoHA;;AAEkG,qGAElG,MAAMA,oBAAAA,CAAAA;AAqBJC,IAAAA,iBAAAA,CAAkBC,MAAwE,EAAE;QAC1F,IAAI,OAAOA,WAAW,UAAA,EAAY;AAChC,YAAA,MAAMC,MAAAA,GAASD,MAAAA,CAAO,IAAI,CAACE,mBAAmB,CAAA;AAC9C,YAAA,IAAI,OAAOD,MAAAA,KAAW,QAAA,IAAYA,MAAAA,KAAW,IAAA,EAAM;AACjD,gBAAA,MAAM,IAAIE,KAAAA,CACR,CAAC,oGAAoG,EAAEC,iBAAiBH,MAAAA,CAAAA,CAAAA,CAAS,CAAA;AAErI,YAAA;YACA,IAAI,CAACC,mBAAmB,GAAGD,MAAAA;QAC7B,CAAA,MAAO,IAAI,OAAOD,MAAAA,KAAW,QAAA,EAAU;YACrC,IAAI,CAACE,mBAAmB,GAAG;gBAAE,GAAG,IAAI,CAACA,mBAAmB;AAAE,gBAAA,GAAGF;AAAO,aAAA;QACtE,CAAA,MAAO;AACL,YAAA,MAAM,IAAIG,KAAAA,CACR,CAAC,oGAAoG,EAAEC,iBACrGJ,MAAAA,CAAAA,CAAAA,CACC,CAAA;AAEP,QAAA;AACF,IAAA;AAIAK,IAAAA,oBAAAA,CAAqBC,MAA6D,EAAE;QAClF,IAAIC,KAAAA,CAAMC,OAAO,CAACF,MAAAA,CAAAA,EAAS;YACzB,IAAI,CAACG,kBAAkB,GAAG;AAAI,gBAAA,GAAA,IAAI,CAACA,kBAAkB;AAAKH,gBAAAA,GAAAA;AAAO,aAAA;QACnE,CAAA,MAAO,IAAI,OAAOA,MAAAA,KAAW,UAAA,EAAY;AACvC,YAAA,IAAI,CAACG,kBAAkB,GAAGH,MAAAA,CAAO,IAAI,CAACG,kBAAkB,CAAA;QAC1D,CAAA,MAAO;AACL,YAAA,MAAM,IAAIN,KAAAA,CACR,CAAC,sGAAsG,EAAEC,iBACvGE,MAAAA,CAAAA,CAAAA,CACC,CAAA;AAEP,QAAA;AACF,IAAA;AAIAI,IAAAA,iBAAAA,CACEC,OAAgF,EAChF;QACA,IAAIJ,KAAAA,CAAMC,OAAO,CAACG,OAAAA,CAAAA,EAAU;YAC1B,IAAI,CAACC,eAAe,GAAG;AAAI,gBAAA,GAAA,IAAI,CAACA,eAAe;AAAKD,gBAAAA,GAAAA;AAAQ,aAAA;QAC9D,CAAA,MAAO,IAAI,OAAOA,OAAAA,KAAY,UAAA,EAAY;AACxC,YAAA,IAAI,CAACC,eAAe,GAAGD,OAAAA,CAAQ,IAAI,CAACC,eAAe,CAAA;QACrD,CAAA,MAAO;AACL,YAAA,MAAM,IAAIT,KAAAA,CACR,CAAC,oGAAoG,EAAEC,iBACrGO,OAAAA,CAAAA,CAAAA,CACC,CAAA;AAEP,QAAA;AACF,IAAA;AAIAE,IAAAA,uBAAAA,CACEF,OAA4E,EAC5E;QACA,IAAIJ,KAAAA,CAAMC,OAAO,CAACG,OAAAA,CAAAA,EAAU;YAC1B,IAAI,CAACG,aAAa,GAAG;AAAI,gBAAA,GAAA,IAAI,CAACA,aAAa;AAAKH,gBAAAA,GAAAA;AAAQ,aAAA;QAC1D,CAAA,MAAO,IAAI,OAAOA,OAAAA,KAAY,UAAA,EAAY;AACxC,YAAA,IAAI,CAACG,aAAa,GAAGH,OAAAA,CAAQ,IAAI,CAACG,aAAa,CAAA;QACjD,CAAA,MAAO;AACL,YAAA,MAAM,IAAIX,KAAAA,CACR,CAAC,0GAA0G,EAAEC,iBAC3GO,OAAAA,CAAAA,CAAAA,CACC,CAAA;AAEP,QAAA;AACF,IAAA;AAIAI,IAAAA,aAAAA,CAAcJ,OAAwE,EAAE;QACtF,IAAIJ,KAAAA,CAAMC,OAAO,CAACG,OAAAA,CAAAA,EAAU;YAC1B,IAAI,CAACK,WAAW,GAAG;AAAI,gBAAA,GAAA,IAAI,CAACA,WAAW;AAAKL,gBAAAA,GAAAA;AAAQ,aAAA;QACtD,CAAA,MAAO,IAAI,OAAOA,OAAAA,KAAY,UAAA,EAAY;AACxC,YAAA,IAAI,CAACK,WAAW,GAAGL,OAAAA,CAAQ,IAAI,CAACK,WAAW,CAAA;QAC7C,CAAA,MAAO;AACL,YAAA,MAAM,IAAIb,KAAAA,CACR,CAAC,gGAAgG,EAAEC,iBACjGO,OAAAA,CAAAA,CAAAA,CACC,CAAA;AAEP,QAAA;AACF,IAAA;AAEA,IAAA,IAAIM,MAAAA,GAAS;QACX,OAAO;YACLC,EAAAA,EAAIC,gBAAAA;YACJC,IAAAA,EAAM,iBAAA;YACNC,cAAAA,EAAgBC,6BAAAA;YAChBC,IAAAA,EAAM;AACJR,gBAAAA,aAAAA,EAAe,IAAI,CAACA,aAAa,CAACS,IAAI,CAAC,IAAI,CAAA;AAC3Cd,gBAAAA,iBAAAA,EAAmB,IAAI,CAACA,iBAAiB,CAACc,IAAI,CAAC,IAAI,CAAA;AACnDX,gBAAAA,uBAAAA,EAAyB,IAAI,CAACA,uBAAuB,CAACW,IAAI,CAAC,IAAI,CAAA;AAC/DnB,gBAAAA,oBAAAA,EAAsB,IAAI,CAACA,oBAAoB,CAACmB,IAAI,CAAC,IAAI,CAAA;AACzDzB,gBAAAA,iBAAAA,EAAmB,IAAI,CAACA,iBAAiB,CAACyB,IAAI,CAAC,IAAI,CAAA;gBACnDC,cAAAA,EAAgB,IAAM,IAAI,CAACT,WAAW;AACtCU,gBAAAA,kBAAAA,EAAoB,CAACC,QAAAA,GAAAA;AACnB;;;;;;AAMC,cACD,IAAIA,QAAAA,EAAU;AACZ,wBAAA,OAAO,IAAI,CAACf,eAAe,CAACgB,MAAM,CAAC,CAACC,MAAAA,GAAAA;4BAClC,OAAOA,MAAAA,CAAOF,QAAQ,IAAIG,SAAAA,IAAa;AAACD,gCAAAA,MAAAA,CAAOF;6BAAS,CAACI,IAAI,EAAA,CAAGC,QAAQ,CAACL,QAAAA,CAAAA;AAC3E,wBAAA,CAAA,CAAA;AACF,oBAAA;oBAEA,OAAO,IAAI,CAACf,eAAe;AAC7B,gBAAA,CAAA;gBACAqB,qBAAAA,EAAuB,IAAM,IAAI,CAACxB,kBAAkB;gBACpDyB,gBAAAA,EAAkB,IAAM,IAAI,CAACpB,aAAa;AAC1CqB,gBAAAA,iBAAAA,EAAmB,KAAO;wBAAE,GAAG,IAAI,CAACjC;qBAAoB;AAC1D;AACF,SAAA;AACF,IAAA;IA7HA,WAAA,EAAc;AAhBd;;;;;AAKC,MAAA,IAAA,CACDA,mBAAAA,GAA2C;AAAE,YAAA,GAAGkC;AAAmB,SAAA;aACnEpB,WAAAA,GAAqC;AAAIqB,YAAAA,GAAAA;AAAqB,SAAA;aAC9DzB,eAAAA,GAA6C;AACxC0B,YAAAA,GAAAA,+BAAAA;AACAC,YAAAA,GAAAA,sCAAAA;AACAC,YAAAA,GAAAA;AACJ,SAAA;aACD/B,kBAAAA,GAAuC;AAACgC,YAAAA;AAAa,SAAA;AACrD3B,QAAAA,IAAAA,CAAAA,aAAAA,GAAyC,EAAE;AAE5B,IAAA;AA8HjB;AAEA;;;;;;IASA,MAAMV,mBAAmB,CAACsC,KAAAA,GAAAA;AACxB,IAAA,MAAMC,aAAa,OAAOD,KAAAA;AAE1B,IAAA,IAAIC,eAAe,QAAA,EAAU;QAC3B,IAAID,KAAAA,KAAU,MAAM,OAAO,MAAA;AAC3B,QAAA,IAAInC,KAAAA,CAAMC,OAAO,CAACkC,KAAAA,CAAAA,EAAQ,OAAO,OAAA;AACjC,QAAA,IAAIA,iBAAiBE,MAAAA,IAAUF,KAAAA,CAAM,WAAW,CAACtB,IAAI,KAAK,QAAA,EAAU;YAClE,OAAOsB,KAAAA,CAAM,WAAW,CAACtB,IAAI;AAC/B,QAAA;AACF,IAAA;IAEA,OAAOuB,UAAAA;AACT,CAAA;;;;"}
1
+ {"version":3,"file":"content-manager.js","sources":["../../admin/src/content-manager.ts"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\n\nimport { INJECTION_ZONES } from './components/InjectionZone';\nimport { PLUGIN_ID } from './constants/plugin';\nimport {\n DEFAULT_ACTIONS,\n type DocumentActionPosition,\n type DocumentActionDescription,\n} from './pages/EditView/components/DocumentActions';\nimport { RichTextBlocksStore } from './pages/EditView/components/FormInputs/BlocksInput/BlocksEditor';\nimport { defaultBlocksStore } from './pages/EditView/components/FormInputs/BlocksInput/DefaultBlocksStore';\nimport {\n DEFAULT_HEADER_ACTIONS,\n type HeaderActionDescription,\n} from './pages/EditView/components/Header';\nimport { ActionsPanel, type PanelDescription } from './pages/EditView/components/Panels';\nimport {\n DEFAULT_BULK_ACTIONS,\n type BulkActionDescription,\n} from './pages/ListView/components/BulkActions/Actions';\nimport { DEFAULT_TABLE_ROW_ACTIONS } from './pages/ListView/components/TableActions';\n\nimport type { Document } from './hooks/useDocument';\nimport type { DocumentMetadata } from '../../shared/contracts/collection-types';\nimport type { DescriptionComponent, PluginConfig } from '@strapi/admin/strapi-admin';\n\n/* -------------------------------------------------------------------------------------------------\n * Configuration Types\n * -----------------------------------------------------------------------------------------------*/\n\ntype DescriptionReducer<Config extends object> = (prev: Config[]) => Config[];\ntype DescriptionObjReducer<Config extends object> = (prev: Config) => Config;\n\ninterface EditViewContext {\n /**\n * This will ONLY be null, if the content-type\n * does not have draft & published enabled.\n */\n activeTab: 'draft' | 'published' | null;\n /**\n * Will be either 'single-types' | 'collection-types'\n */\n collectionType: string;\n /**\n * this will be undefined if someone is creating an entry.\n */\n document?: Document;\n /**\n * this will be undefined if someone is creating an entry.\n */\n documentId?: string;\n /**\n * this will be undefined if someone is creating an entry.\n */\n meta?: DocumentMetadata;\n /**\n * The current content-type's model.\n */\n model: string;\n}\n\ninterface ListViewContext {\n /**\n * Will be either 'single-types' | 'collection-types'\n */\n collectionType: string;\n /**\n * The current selected documents in the table\n */\n documents: Document[];\n /**\n * The current content-type's model.\n */\n model: string;\n}\n\ninterface PanelComponentProps extends EditViewContext {}\n\ninterface PanelComponent extends DescriptionComponent<PanelComponentProps, PanelDescription> {\n /**\n * The defaults are added by Strapi only, if you're providing your own component,\n * you do not need to provide this.\n */\n type?: 'actions' | 'releases';\n}\n\ninterface DocumentActionProps extends EditViewContext {}\n\ninterface DocumentActionComponent\n extends DescriptionComponent<DocumentActionProps, DocumentActionDescription> {\n type?:\n | 'clone'\n | 'configure-the-view'\n | 'delete'\n | 'discard'\n | 'edit'\n | 'edit-the-model'\n | 'history'\n | 'publish'\n | 'unpublish'\n | 'update';\n position?: DocumentActionDescription['position'];\n}\n\ninterface HeaderActionProps extends EditViewContext {}\n\ninterface HeaderActionComponent\n extends DescriptionComponent<HeaderActionProps, HeaderActionDescription> {}\n\ninterface BulkActionComponentProps extends ListViewContext {}\n\ninterface BulkActionComponent\n extends DescriptionComponent<BulkActionComponentProps, BulkActionDescription> {\n type?: 'delete' | 'publish' | 'unpublish';\n}\n\n/* -------------------------------------------------------------------------------------------------\n * ContentManager plugin\n * -----------------------------------------------------------------------------------------------*/\n\nclass ContentManagerPlugin {\n /**\n * The following properties are the stored ones provided by any plugins registering with\n * the content-manager. The function calls however, need to be called at runtime in the\n * application, so instead we collate them and run them later with the complete list incl.\n * ones already registered & the context of the view.\n */\n richTextBlocksStore: RichTextBlocksStore = { ...defaultBlocksStore };\n bulkActions: BulkActionComponent[] = [...DEFAULT_BULK_ACTIONS];\n documentActions: DocumentActionComponent[] = [\n ...DEFAULT_ACTIONS,\n ...DEFAULT_TABLE_ROW_ACTIONS,\n ...DEFAULT_HEADER_ACTIONS,\n ];\n editViewSidePanels: PanelComponent[] = [ActionsPanel];\n headerActions: HeaderActionComponent[] = [];\n\n constructor() {}\n\n addRichTextBlocks(blocks: RichTextBlocksStore): void;\n addRichTextBlocks(blocks: DescriptionObjReducer<RichTextBlocksStore>): void;\n addRichTextBlocks(blocks: RichTextBlocksStore | DescriptionObjReducer<RichTextBlocksStore>) {\n if (typeof blocks === 'function') {\n const result = blocks(this.richTextBlocksStore);\n if (typeof result !== 'object' || result === null) {\n throw new Error(\n `Expected the \\`blocks\\` passed to \\`addRichTextBlocks\\` to be an object or a function, but received ${getPrintableType(result)}`\n );\n }\n this.richTextBlocksStore = result;\n } else if (typeof blocks === 'object') {\n this.richTextBlocksStore = { ...this.richTextBlocksStore, ...blocks };\n } else {\n throw new Error(\n `Expected the \\`blocks\\` passed to \\`addRichTextBlocks\\` to be an object or a function, but received ${getPrintableType(\n blocks\n )}`\n );\n }\n }\n\n addEditViewSidePanel(panels: DescriptionReducer<PanelComponent>): void;\n addEditViewSidePanel(panels: PanelComponent[]): void;\n addEditViewSidePanel(panels: DescriptionReducer<PanelComponent> | PanelComponent[]) {\n if (Array.isArray(panels)) {\n validateDescriptionItems(panels, 'addEditViewSidePanel', 'panels');\n this.editViewSidePanels = [...this.editViewSidePanels, ...panels];\n } else if (typeof panels === 'function') {\n const result = panels(this.editViewSidePanels);\n validateDescriptionItems(result, 'addEditViewSidePanel', 'panels');\n this.editViewSidePanels = result;\n } else {\n throw new Error(\n `Expected the \\`panels\\` passed to \\`addEditViewSidePanel\\` to be an array or a function, but received ${getPrintableType(\n panels\n )}`\n );\n }\n }\n\n addDocumentAction(actions: DescriptionReducer<DocumentActionComponent>): void;\n addDocumentAction(actions: DocumentActionComponent[]): void;\n addDocumentAction(\n actions: DescriptionReducer<DocumentActionComponent> | DocumentActionComponent[]\n ) {\n if (Array.isArray(actions)) {\n validateDescriptionItems(actions, 'addDocumentAction', 'actions');\n this.documentActions = [...this.documentActions, ...actions];\n } else if (typeof actions === 'function') {\n const result = actions(this.documentActions);\n validateDescriptionItems(result, 'addDocumentAction', 'actions');\n this.documentActions = result;\n } else {\n throw new Error(\n `Expected the \\`actions\\` passed to \\`addDocumentAction\\` to be an array or a function, but received ${getPrintableType(\n actions\n )}`\n );\n }\n }\n\n addDocumentHeaderAction(actions: DescriptionReducer<HeaderActionComponent>): void;\n addDocumentHeaderAction(actions: HeaderActionComponent[]): void;\n addDocumentHeaderAction(\n actions: DescriptionReducer<HeaderActionComponent> | HeaderActionComponent[]\n ) {\n if (Array.isArray(actions)) {\n validateDescriptionItems(actions, 'addDocumentHeaderAction', 'actions');\n this.headerActions = [...this.headerActions, ...actions];\n } else if (typeof actions === 'function') {\n const result = actions(this.headerActions);\n validateDescriptionItems(result, 'addDocumentHeaderAction', 'actions');\n this.headerActions = result;\n } else {\n throw new Error(\n `Expected the \\`actions\\` passed to \\`addDocumentHeaderAction\\` to be an array or a function, but received ${getPrintableType(\n actions\n )}`\n );\n }\n }\n\n addBulkAction(actions: DescriptionReducer<BulkActionComponent>): void;\n addBulkAction(actions: BulkActionComponent[]): void;\n addBulkAction(actions: DescriptionReducer<BulkActionComponent> | BulkActionComponent[]) {\n if (Array.isArray(actions)) {\n validateDescriptionItems(actions, 'addBulkAction', 'actions');\n this.bulkActions = [...this.bulkActions, ...actions];\n } else if (typeof actions === 'function') {\n const result = actions(this.bulkActions);\n validateDescriptionItems(result, 'addBulkAction', 'actions');\n this.bulkActions = result;\n } else {\n throw new Error(\n `Expected the \\`actions\\` passed to \\`addBulkAction\\` to be an array or a function, but received ${getPrintableType(\n actions\n )}`\n );\n }\n }\n\n get config() {\n return {\n id: PLUGIN_ID,\n name: 'Content Manager',\n injectionZones: INJECTION_ZONES,\n apis: {\n addBulkAction: this.addBulkAction.bind(this),\n addDocumentAction: this.addDocumentAction.bind(this),\n addDocumentHeaderAction: this.addDocumentHeaderAction.bind(this),\n addEditViewSidePanel: this.addEditViewSidePanel.bind(this),\n addRichTextBlocks: this.addRichTextBlocks.bind(this),\n getBulkActions: () => this.bulkActions,\n getDocumentActions: (position?: DocumentActionPosition) => {\n /**\n * When possible, pre-filter the actions by the components static position property.\n * This avoids rendering the actions in multiple places where they weren't displayed,\n * which wasn't visible but created issues with useEffect for instance.\n * The response should still be filtered by the position, as the static property is new\n * and not mandatory to avoid a breaking change.\n */\n if (position) {\n return this.documentActions.filter((action) => {\n return action.position == undefined || [action.position].flat().includes(position);\n });\n }\n\n return this.documentActions;\n },\n getEditViewSidePanels: () => this.editViewSidePanels,\n getHeaderActions: () => this.headerActions,\n getRichTextBlocks: () => ({ ...this.richTextBlocksStore }),\n },\n } satisfies PluginConfig;\n }\n}\n\n/* -------------------------------------------------------------------------------------------------\n * getPrintableType\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal\n * @description Gets the human-friendly printable type name for the given value, for instance it will yield\n * `array` instead of `object`, as the native `typeof` operator would do.\n */\nconst getPrintableType = (value: unknown): string => {\n const nativeType = typeof value;\n\n if (nativeType === 'object') {\n if (value === null) return 'null';\n if (Array.isArray(value)) return 'array';\n if (value instanceof Object && value.constructor.name !== 'Object') {\n return value.constructor.name;\n }\n }\n\n return nativeType;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * validateDescriptionItems\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal\n * @description Descriptions must be functions (they're rendered as components so hooks can be used\n * inside them), not plain objects. Passing a plain object crashes deep inside\n * `DescriptionComponentRenderer` with an unhelpful `description is not a function` error, so we\n * validate eagerly here to fail fast with a clear message pointing at the offending API call.\n */\nconst validateDescriptionItems = (items: unknown[], apiName: string, argName: string): void => {\n items.forEach((item, index) => {\n if (typeof item !== 'function') {\n throw new Error(\n `Expected every item in the \\`${argName}\\` array passed to \\`${apiName}\\` to be a function that returns a description object, but received ${getPrintableType(\n item\n )} at index ${index}. Did you forget to wrap it in a function, e.g. \\`() => ({ ...yourAction })\\`?`\n );\n }\n });\n};\n\nexport { ContentManagerPlugin };\nexport type {\n EditViewContext,\n ListViewContext,\n BulkActionComponent,\n BulkActionComponentProps,\n BulkActionDescription,\n DescriptionComponent,\n DescriptionReducer,\n PanelComponentProps,\n PanelComponent,\n PanelDescription,\n DocumentActionComponent,\n DocumentActionDescription,\n DocumentActionProps,\n HeaderActionComponent,\n HeaderActionDescription,\n HeaderActionProps,\n};\n"],"names":["ContentManagerPlugin","addRichTextBlocks","blocks","result","richTextBlocksStore","Error","getPrintableType","addEditViewSidePanel","panels","Array","isArray","validateDescriptionItems","editViewSidePanels","addDocumentAction","actions","documentActions","addDocumentHeaderAction","headerActions","addBulkAction","bulkActions","config","id","PLUGIN_ID","name","injectionZones","INJECTION_ZONES","apis","bind","getBulkActions","getDocumentActions","position","filter","action","undefined","flat","includes","getEditViewSidePanels","getHeaderActions","getRichTextBlocks","defaultBlocksStore","DEFAULT_BULK_ACTIONS","DEFAULT_ACTIONS","DEFAULT_TABLE_ROW_ACTIONS","DEFAULT_HEADER_ACTIONS","ActionsPanel","value","nativeType","Object","items","apiName","argName","forEach","item","index"],"mappings":"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"}
@@ -28,48 +28,60 @@ import { DEFAULT_TABLE_ROW_ACTIONS } from './pages/ListView/components/TableActi
28
28
  }
29
29
  addEditViewSidePanel(panels) {
30
30
  if (Array.isArray(panels)) {
31
+ validateDescriptionItems(panels, 'addEditViewSidePanel', 'panels');
31
32
  this.editViewSidePanels = [
32
33
  ...this.editViewSidePanels,
33
34
  ...panels
34
35
  ];
35
36
  } else if (typeof panels === 'function') {
36
- this.editViewSidePanels = panels(this.editViewSidePanels);
37
+ const result = panels(this.editViewSidePanels);
38
+ validateDescriptionItems(result, 'addEditViewSidePanel', 'panels');
39
+ this.editViewSidePanels = result;
37
40
  } else {
38
41
  throw new Error(`Expected the \`panels\` passed to \`addEditViewSidePanel\` to be an array or a function, but received ${getPrintableType(panels)}`);
39
42
  }
40
43
  }
41
44
  addDocumentAction(actions) {
42
45
  if (Array.isArray(actions)) {
46
+ validateDescriptionItems(actions, 'addDocumentAction', 'actions');
43
47
  this.documentActions = [
44
48
  ...this.documentActions,
45
49
  ...actions
46
50
  ];
47
51
  } else if (typeof actions === 'function') {
48
- this.documentActions = actions(this.documentActions);
52
+ const result = actions(this.documentActions);
53
+ validateDescriptionItems(result, 'addDocumentAction', 'actions');
54
+ this.documentActions = result;
49
55
  } else {
50
56
  throw new Error(`Expected the \`actions\` passed to \`addDocumentAction\` to be an array or a function, but received ${getPrintableType(actions)}`);
51
57
  }
52
58
  }
53
59
  addDocumentHeaderAction(actions) {
54
60
  if (Array.isArray(actions)) {
61
+ validateDescriptionItems(actions, 'addDocumentHeaderAction', 'actions');
55
62
  this.headerActions = [
56
63
  ...this.headerActions,
57
64
  ...actions
58
65
  ];
59
66
  } else if (typeof actions === 'function') {
60
- this.headerActions = actions(this.headerActions);
67
+ const result = actions(this.headerActions);
68
+ validateDescriptionItems(result, 'addDocumentHeaderAction', 'actions');
69
+ this.headerActions = result;
61
70
  } else {
62
71
  throw new Error(`Expected the \`actions\` passed to \`addDocumentHeaderAction\` to be an array or a function, but received ${getPrintableType(actions)}`);
63
72
  }
64
73
  }
65
74
  addBulkAction(actions) {
66
75
  if (Array.isArray(actions)) {
76
+ validateDescriptionItems(actions, 'addBulkAction', 'actions');
67
77
  this.bulkActions = [
68
78
  ...this.bulkActions,
69
79
  ...actions
70
80
  ];
71
81
  } else if (typeof actions === 'function') {
72
- this.bulkActions = actions(this.bulkActions);
82
+ const result = actions(this.bulkActions);
83
+ validateDescriptionItems(result, 'addBulkAction', 'actions');
84
+ this.bulkActions = result;
73
85
  } else {
74
86
  throw new Error(`Expected the \`actions\` passed to \`addBulkAction\` to be an array or a function, but received ${getPrintableType(actions)}`);
75
87
  }
@@ -150,6 +162,21 @@ import { DEFAULT_TABLE_ROW_ACTIONS } from './pages/ListView/components/TableActi
150
162
  }
151
163
  return nativeType;
152
164
  };
165
+ /* -------------------------------------------------------------------------------------------------
166
+ * validateDescriptionItems
167
+ * -----------------------------------------------------------------------------------------------*/ /**
168
+ * @internal
169
+ * @description Descriptions must be functions (they're rendered as components so hooks can be used
170
+ * inside them), not plain objects. Passing a plain object crashes deep inside
171
+ * `DescriptionComponentRenderer` with an unhelpful `description is not a function` error, so we
172
+ * validate eagerly here to fail fast with a clear message pointing at the offending API call.
173
+ */ const validateDescriptionItems = (items, apiName, argName)=>{
174
+ items.forEach((item, index)=>{
175
+ if (typeof item !== 'function') {
176
+ throw new Error(`Expected every item in the \`${argName}\` array passed to \`${apiName}\` to be a function that returns a description object, but received ${getPrintableType(item)} at index ${index}. Did you forget to wrap it in a function, e.g. \`() => ({ ...yourAction })\`?`);
177
+ }
178
+ });
179
+ };
153
180
 
154
181
  export { ContentManagerPlugin };
155
182
  //# sourceMappingURL=content-manager.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"content-manager.mjs","sources":["../../admin/src/content-manager.ts"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\n\nimport { INJECTION_ZONES } from './components/InjectionZone';\nimport { PLUGIN_ID } from './constants/plugin';\nimport {\n DEFAULT_ACTIONS,\n type DocumentActionPosition,\n type DocumentActionDescription,\n} from './pages/EditView/components/DocumentActions';\nimport { RichTextBlocksStore } from './pages/EditView/components/FormInputs/BlocksInput/BlocksEditor';\nimport { defaultBlocksStore } from './pages/EditView/components/FormInputs/BlocksInput/DefaultBlocksStore';\nimport {\n DEFAULT_HEADER_ACTIONS,\n type HeaderActionDescription,\n} from './pages/EditView/components/Header';\nimport { ActionsPanel, type PanelDescription } from './pages/EditView/components/Panels';\nimport {\n DEFAULT_BULK_ACTIONS,\n type BulkActionDescription,\n} from './pages/ListView/components/BulkActions/Actions';\nimport { DEFAULT_TABLE_ROW_ACTIONS } from './pages/ListView/components/TableActions';\n\nimport type { Document } from './hooks/useDocument';\nimport type { DocumentMetadata } from '../../shared/contracts/collection-types';\nimport type { DescriptionComponent, PluginConfig } from '@strapi/admin/strapi-admin';\n\n/* -------------------------------------------------------------------------------------------------\n * Configuration Types\n * -----------------------------------------------------------------------------------------------*/\n\ntype DescriptionReducer<Config extends object> = (prev: Config[]) => Config[];\ntype DescriptionObjReducer<Config extends object> = (prev: Config) => Config;\n\ninterface EditViewContext {\n /**\n * This will ONLY be null, if the content-type\n * does not have draft & published enabled.\n */\n activeTab: 'draft' | 'published' | null;\n /**\n * Will be either 'single-types' | 'collection-types'\n */\n collectionType: string;\n /**\n * this will be undefined if someone is creating an entry.\n */\n document?: Document;\n /**\n * this will be undefined if someone is creating an entry.\n */\n documentId?: string;\n /**\n * this will be undefined if someone is creating an entry.\n */\n meta?: DocumentMetadata;\n /**\n * The current content-type's model.\n */\n model: string;\n}\n\ninterface ListViewContext {\n /**\n * Will be either 'single-types' | 'collection-types'\n */\n collectionType: string;\n /**\n * The current selected documents in the table\n */\n documents: Document[];\n /**\n * The current content-type's model.\n */\n model: string;\n}\n\ninterface PanelComponentProps extends EditViewContext {}\n\ninterface PanelComponent extends DescriptionComponent<PanelComponentProps, PanelDescription> {\n /**\n * The defaults are added by Strapi only, if you're providing your own component,\n * you do not need to provide this.\n */\n type?: 'actions' | 'releases';\n}\n\ninterface DocumentActionProps extends EditViewContext {}\n\ninterface DocumentActionComponent\n extends DescriptionComponent<DocumentActionProps, DocumentActionDescription> {\n type?:\n | 'clone'\n | 'configure-the-view'\n | 'delete'\n | 'discard'\n | 'edit'\n | 'edit-the-model'\n | 'history'\n | 'publish'\n | 'unpublish'\n | 'update';\n position?: DocumentActionDescription['position'];\n}\n\ninterface HeaderActionProps extends EditViewContext {}\n\ninterface HeaderActionComponent\n extends DescriptionComponent<HeaderActionProps, HeaderActionDescription> {}\n\ninterface BulkActionComponentProps extends ListViewContext {}\n\ninterface BulkActionComponent\n extends DescriptionComponent<BulkActionComponentProps, BulkActionDescription> {\n type?: 'delete' | 'publish' | 'unpublish';\n}\n\n/* -------------------------------------------------------------------------------------------------\n * ContentManager plugin\n * -----------------------------------------------------------------------------------------------*/\n\nclass ContentManagerPlugin {\n /**\n * The following properties are the stored ones provided by any plugins registering with\n * the content-manager. The function calls however, need to be called at runtime in the\n * application, so instead we collate them and run them later with the complete list incl.\n * ones already registered & the context of the view.\n */\n richTextBlocksStore: RichTextBlocksStore = { ...defaultBlocksStore };\n bulkActions: BulkActionComponent[] = [...DEFAULT_BULK_ACTIONS];\n documentActions: DocumentActionComponent[] = [\n ...DEFAULT_ACTIONS,\n ...DEFAULT_TABLE_ROW_ACTIONS,\n ...DEFAULT_HEADER_ACTIONS,\n ];\n editViewSidePanels: PanelComponent[] = [ActionsPanel];\n headerActions: HeaderActionComponent[] = [];\n\n constructor() {}\n\n addRichTextBlocks(blocks: RichTextBlocksStore): void;\n addRichTextBlocks(blocks: DescriptionObjReducer<RichTextBlocksStore>): void;\n addRichTextBlocks(blocks: RichTextBlocksStore | DescriptionObjReducer<RichTextBlocksStore>) {\n if (typeof blocks === 'function') {\n const result = blocks(this.richTextBlocksStore);\n if (typeof result !== 'object' || result === null) {\n throw new Error(\n `Expected the \\`blocks\\` passed to \\`addRichTextBlocks\\` to be an object or a function, but received ${getPrintableType(result)}`\n );\n }\n this.richTextBlocksStore = result;\n } else if (typeof blocks === 'object') {\n this.richTextBlocksStore = { ...this.richTextBlocksStore, ...blocks };\n } else {\n throw new Error(\n `Expected the \\`blocks\\` passed to \\`addRichTextBlocks\\` to be an object or a function, but received ${getPrintableType(\n blocks\n )}`\n );\n }\n }\n\n addEditViewSidePanel(panels: DescriptionReducer<PanelComponent>): void;\n addEditViewSidePanel(panels: PanelComponent[]): void;\n addEditViewSidePanel(panels: DescriptionReducer<PanelComponent> | PanelComponent[]) {\n if (Array.isArray(panels)) {\n this.editViewSidePanels = [...this.editViewSidePanels, ...panels];\n } else if (typeof panels === 'function') {\n this.editViewSidePanels = panels(this.editViewSidePanels);\n } else {\n throw new Error(\n `Expected the \\`panels\\` passed to \\`addEditViewSidePanel\\` to be an array or a function, but received ${getPrintableType(\n panels\n )}`\n );\n }\n }\n\n addDocumentAction(actions: DescriptionReducer<DocumentActionComponent>): void;\n addDocumentAction(actions: DocumentActionComponent[]): void;\n addDocumentAction(\n actions: DescriptionReducer<DocumentActionComponent> | DocumentActionComponent[]\n ) {\n if (Array.isArray(actions)) {\n this.documentActions = [...this.documentActions, ...actions];\n } else if (typeof actions === 'function') {\n this.documentActions = actions(this.documentActions);\n } else {\n throw new Error(\n `Expected the \\`actions\\` passed to \\`addDocumentAction\\` to be an array or a function, but received ${getPrintableType(\n actions\n )}`\n );\n }\n }\n\n addDocumentHeaderAction(actions: DescriptionReducer<HeaderActionComponent>): void;\n addDocumentHeaderAction(actions: HeaderActionComponent[]): void;\n addDocumentHeaderAction(\n actions: DescriptionReducer<HeaderActionComponent> | HeaderActionComponent[]\n ) {\n if (Array.isArray(actions)) {\n this.headerActions = [...this.headerActions, ...actions];\n } else if (typeof actions === 'function') {\n this.headerActions = actions(this.headerActions);\n } else {\n throw new Error(\n `Expected the \\`actions\\` passed to \\`addDocumentHeaderAction\\` to be an array or a function, but received ${getPrintableType(\n actions\n )}`\n );\n }\n }\n\n addBulkAction(actions: DescriptionReducer<BulkActionComponent>): void;\n addBulkAction(actions: BulkActionComponent[]): void;\n addBulkAction(actions: DescriptionReducer<BulkActionComponent> | BulkActionComponent[]) {\n if (Array.isArray(actions)) {\n this.bulkActions = [...this.bulkActions, ...actions];\n } else if (typeof actions === 'function') {\n this.bulkActions = actions(this.bulkActions);\n } else {\n throw new Error(\n `Expected the \\`actions\\` passed to \\`addBulkAction\\` to be an array or a function, but received ${getPrintableType(\n actions\n )}`\n );\n }\n }\n\n get config() {\n return {\n id: PLUGIN_ID,\n name: 'Content Manager',\n injectionZones: INJECTION_ZONES,\n apis: {\n addBulkAction: this.addBulkAction.bind(this),\n addDocumentAction: this.addDocumentAction.bind(this),\n addDocumentHeaderAction: this.addDocumentHeaderAction.bind(this),\n addEditViewSidePanel: this.addEditViewSidePanel.bind(this),\n addRichTextBlocks: this.addRichTextBlocks.bind(this),\n getBulkActions: () => this.bulkActions,\n getDocumentActions: (position?: DocumentActionPosition) => {\n /**\n * When possible, pre-filter the actions by the components static position property.\n * This avoids rendering the actions in multiple places where they weren't displayed,\n * which wasn't visible but created issues with useEffect for instance.\n * The response should still be filtered by the position, as the static property is new\n * and not mandatory to avoid a breaking change.\n */\n if (position) {\n return this.documentActions.filter((action) => {\n return action.position == undefined || [action.position].flat().includes(position);\n });\n }\n\n return this.documentActions;\n },\n getEditViewSidePanels: () => this.editViewSidePanels,\n getHeaderActions: () => this.headerActions,\n getRichTextBlocks: () => ({ ...this.richTextBlocksStore }),\n },\n } satisfies PluginConfig;\n }\n}\n\n/* -------------------------------------------------------------------------------------------------\n * getPrintableType\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal\n * @description Gets the human-friendly printable type name for the given value, for instance it will yield\n * `array` instead of `object`, as the native `typeof` operator would do.\n */\nconst getPrintableType = (value: unknown): string => {\n const nativeType = typeof value;\n\n if (nativeType === 'object') {\n if (value === null) return 'null';\n if (Array.isArray(value)) return 'array';\n if (value instanceof Object && value.constructor.name !== 'Object') {\n return value.constructor.name;\n }\n }\n\n return nativeType;\n};\n\nexport { ContentManagerPlugin };\nexport type {\n EditViewContext,\n ListViewContext,\n BulkActionComponent,\n BulkActionComponentProps,\n BulkActionDescription,\n DescriptionComponent,\n DescriptionReducer,\n PanelComponentProps,\n PanelComponent,\n PanelDescription,\n DocumentActionComponent,\n DocumentActionDescription,\n DocumentActionProps,\n HeaderActionComponent,\n HeaderActionDescription,\n HeaderActionProps,\n};\n"],"names":["ContentManagerPlugin","addRichTextBlocks","blocks","result","richTextBlocksStore","Error","getPrintableType","addEditViewSidePanel","panels","Array","isArray","editViewSidePanels","addDocumentAction","actions","documentActions","addDocumentHeaderAction","headerActions","addBulkAction","bulkActions","config","id","PLUGIN_ID","name","injectionZones","INJECTION_ZONES","apis","bind","getBulkActions","getDocumentActions","position","filter","action","undefined","flat","includes","getEditViewSidePanels","getHeaderActions","getRichTextBlocks","defaultBlocksStore","DEFAULT_BULK_ACTIONS","DEFAULT_ACTIONS","DEFAULT_TABLE_ROW_ACTIONS","DEFAULT_HEADER_ACTIONS","ActionsPanel","value","nativeType","Object"],"mappings":"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"}
1
+ {"version":3,"file":"content-manager.mjs","sources":["../../admin/src/content-manager.ts"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\n\nimport { INJECTION_ZONES } from './components/InjectionZone';\nimport { PLUGIN_ID } from './constants/plugin';\nimport {\n DEFAULT_ACTIONS,\n type DocumentActionPosition,\n type DocumentActionDescription,\n} from './pages/EditView/components/DocumentActions';\nimport { RichTextBlocksStore } from './pages/EditView/components/FormInputs/BlocksInput/BlocksEditor';\nimport { defaultBlocksStore } from './pages/EditView/components/FormInputs/BlocksInput/DefaultBlocksStore';\nimport {\n DEFAULT_HEADER_ACTIONS,\n type HeaderActionDescription,\n} from './pages/EditView/components/Header';\nimport { ActionsPanel, type PanelDescription } from './pages/EditView/components/Panels';\nimport {\n DEFAULT_BULK_ACTIONS,\n type BulkActionDescription,\n} from './pages/ListView/components/BulkActions/Actions';\nimport { DEFAULT_TABLE_ROW_ACTIONS } from './pages/ListView/components/TableActions';\n\nimport type { Document } from './hooks/useDocument';\nimport type { DocumentMetadata } from '../../shared/contracts/collection-types';\nimport type { DescriptionComponent, PluginConfig } from '@strapi/admin/strapi-admin';\n\n/* -------------------------------------------------------------------------------------------------\n * Configuration Types\n * -----------------------------------------------------------------------------------------------*/\n\ntype DescriptionReducer<Config extends object> = (prev: Config[]) => Config[];\ntype DescriptionObjReducer<Config extends object> = (prev: Config) => Config;\n\ninterface EditViewContext {\n /**\n * This will ONLY be null, if the content-type\n * does not have draft & published enabled.\n */\n activeTab: 'draft' | 'published' | null;\n /**\n * Will be either 'single-types' | 'collection-types'\n */\n collectionType: string;\n /**\n * this will be undefined if someone is creating an entry.\n */\n document?: Document;\n /**\n * this will be undefined if someone is creating an entry.\n */\n documentId?: string;\n /**\n * this will be undefined if someone is creating an entry.\n */\n meta?: DocumentMetadata;\n /**\n * The current content-type's model.\n */\n model: string;\n}\n\ninterface ListViewContext {\n /**\n * Will be either 'single-types' | 'collection-types'\n */\n collectionType: string;\n /**\n * The current selected documents in the table\n */\n documents: Document[];\n /**\n * The current content-type's model.\n */\n model: string;\n}\n\ninterface PanelComponentProps extends EditViewContext {}\n\ninterface PanelComponent extends DescriptionComponent<PanelComponentProps, PanelDescription> {\n /**\n * The defaults are added by Strapi only, if you're providing your own component,\n * you do not need to provide this.\n */\n type?: 'actions' | 'releases';\n}\n\ninterface DocumentActionProps extends EditViewContext {}\n\ninterface DocumentActionComponent\n extends DescriptionComponent<DocumentActionProps, DocumentActionDescription> {\n type?:\n | 'clone'\n | 'configure-the-view'\n | 'delete'\n | 'discard'\n | 'edit'\n | 'edit-the-model'\n | 'history'\n | 'publish'\n | 'unpublish'\n | 'update';\n position?: DocumentActionDescription['position'];\n}\n\ninterface HeaderActionProps extends EditViewContext {}\n\ninterface HeaderActionComponent\n extends DescriptionComponent<HeaderActionProps, HeaderActionDescription> {}\n\ninterface BulkActionComponentProps extends ListViewContext {}\n\ninterface BulkActionComponent\n extends DescriptionComponent<BulkActionComponentProps, BulkActionDescription> {\n type?: 'delete' | 'publish' | 'unpublish';\n}\n\n/* -------------------------------------------------------------------------------------------------\n * ContentManager plugin\n * -----------------------------------------------------------------------------------------------*/\n\nclass ContentManagerPlugin {\n /**\n * The following properties are the stored ones provided by any plugins registering with\n * the content-manager. The function calls however, need to be called at runtime in the\n * application, so instead we collate them and run them later with the complete list incl.\n * ones already registered & the context of the view.\n */\n richTextBlocksStore: RichTextBlocksStore = { ...defaultBlocksStore };\n bulkActions: BulkActionComponent[] = [...DEFAULT_BULK_ACTIONS];\n documentActions: DocumentActionComponent[] = [\n ...DEFAULT_ACTIONS,\n ...DEFAULT_TABLE_ROW_ACTIONS,\n ...DEFAULT_HEADER_ACTIONS,\n ];\n editViewSidePanels: PanelComponent[] = [ActionsPanel];\n headerActions: HeaderActionComponent[] = [];\n\n constructor() {}\n\n addRichTextBlocks(blocks: RichTextBlocksStore): void;\n addRichTextBlocks(blocks: DescriptionObjReducer<RichTextBlocksStore>): void;\n addRichTextBlocks(blocks: RichTextBlocksStore | DescriptionObjReducer<RichTextBlocksStore>) {\n if (typeof blocks === 'function') {\n const result = blocks(this.richTextBlocksStore);\n if (typeof result !== 'object' || result === null) {\n throw new Error(\n `Expected the \\`blocks\\` passed to \\`addRichTextBlocks\\` to be an object or a function, but received ${getPrintableType(result)}`\n );\n }\n this.richTextBlocksStore = result;\n } else if (typeof blocks === 'object') {\n this.richTextBlocksStore = { ...this.richTextBlocksStore, ...blocks };\n } else {\n throw new Error(\n `Expected the \\`blocks\\` passed to \\`addRichTextBlocks\\` to be an object or a function, but received ${getPrintableType(\n blocks\n )}`\n );\n }\n }\n\n addEditViewSidePanel(panels: DescriptionReducer<PanelComponent>): void;\n addEditViewSidePanel(panels: PanelComponent[]): void;\n addEditViewSidePanel(panels: DescriptionReducer<PanelComponent> | PanelComponent[]) {\n if (Array.isArray(panels)) {\n validateDescriptionItems(panels, 'addEditViewSidePanel', 'panels');\n this.editViewSidePanels = [...this.editViewSidePanels, ...panels];\n } else if (typeof panels === 'function') {\n const result = panels(this.editViewSidePanels);\n validateDescriptionItems(result, 'addEditViewSidePanel', 'panels');\n this.editViewSidePanels = result;\n } else {\n throw new Error(\n `Expected the \\`panels\\` passed to \\`addEditViewSidePanel\\` to be an array or a function, but received ${getPrintableType(\n panels\n )}`\n );\n }\n }\n\n addDocumentAction(actions: DescriptionReducer<DocumentActionComponent>): void;\n addDocumentAction(actions: DocumentActionComponent[]): void;\n addDocumentAction(\n actions: DescriptionReducer<DocumentActionComponent> | DocumentActionComponent[]\n ) {\n if (Array.isArray(actions)) {\n validateDescriptionItems(actions, 'addDocumentAction', 'actions');\n this.documentActions = [...this.documentActions, ...actions];\n } else if (typeof actions === 'function') {\n const result = actions(this.documentActions);\n validateDescriptionItems(result, 'addDocumentAction', 'actions');\n this.documentActions = result;\n } else {\n throw new Error(\n `Expected the \\`actions\\` passed to \\`addDocumentAction\\` to be an array or a function, but received ${getPrintableType(\n actions\n )}`\n );\n }\n }\n\n addDocumentHeaderAction(actions: DescriptionReducer<HeaderActionComponent>): void;\n addDocumentHeaderAction(actions: HeaderActionComponent[]): void;\n addDocumentHeaderAction(\n actions: DescriptionReducer<HeaderActionComponent> | HeaderActionComponent[]\n ) {\n if (Array.isArray(actions)) {\n validateDescriptionItems(actions, 'addDocumentHeaderAction', 'actions');\n this.headerActions = [...this.headerActions, ...actions];\n } else if (typeof actions === 'function') {\n const result = actions(this.headerActions);\n validateDescriptionItems(result, 'addDocumentHeaderAction', 'actions');\n this.headerActions = result;\n } else {\n throw new Error(\n `Expected the \\`actions\\` passed to \\`addDocumentHeaderAction\\` to be an array or a function, but received ${getPrintableType(\n actions\n )}`\n );\n }\n }\n\n addBulkAction(actions: DescriptionReducer<BulkActionComponent>): void;\n addBulkAction(actions: BulkActionComponent[]): void;\n addBulkAction(actions: DescriptionReducer<BulkActionComponent> | BulkActionComponent[]) {\n if (Array.isArray(actions)) {\n validateDescriptionItems(actions, 'addBulkAction', 'actions');\n this.bulkActions = [...this.bulkActions, ...actions];\n } else if (typeof actions === 'function') {\n const result = actions(this.bulkActions);\n validateDescriptionItems(result, 'addBulkAction', 'actions');\n this.bulkActions = result;\n } else {\n throw new Error(\n `Expected the \\`actions\\` passed to \\`addBulkAction\\` to be an array or a function, but received ${getPrintableType(\n actions\n )}`\n );\n }\n }\n\n get config() {\n return {\n id: PLUGIN_ID,\n name: 'Content Manager',\n injectionZones: INJECTION_ZONES,\n apis: {\n addBulkAction: this.addBulkAction.bind(this),\n addDocumentAction: this.addDocumentAction.bind(this),\n addDocumentHeaderAction: this.addDocumentHeaderAction.bind(this),\n addEditViewSidePanel: this.addEditViewSidePanel.bind(this),\n addRichTextBlocks: this.addRichTextBlocks.bind(this),\n getBulkActions: () => this.bulkActions,\n getDocumentActions: (position?: DocumentActionPosition) => {\n /**\n * When possible, pre-filter the actions by the components static position property.\n * This avoids rendering the actions in multiple places where they weren't displayed,\n * which wasn't visible but created issues with useEffect for instance.\n * The response should still be filtered by the position, as the static property is new\n * and not mandatory to avoid a breaking change.\n */\n if (position) {\n return this.documentActions.filter((action) => {\n return action.position == undefined || [action.position].flat().includes(position);\n });\n }\n\n return this.documentActions;\n },\n getEditViewSidePanels: () => this.editViewSidePanels,\n getHeaderActions: () => this.headerActions,\n getRichTextBlocks: () => ({ ...this.richTextBlocksStore }),\n },\n } satisfies PluginConfig;\n }\n}\n\n/* -------------------------------------------------------------------------------------------------\n * getPrintableType\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal\n * @description Gets the human-friendly printable type name for the given value, for instance it will yield\n * `array` instead of `object`, as the native `typeof` operator would do.\n */\nconst getPrintableType = (value: unknown): string => {\n const nativeType = typeof value;\n\n if (nativeType === 'object') {\n if (value === null) return 'null';\n if (Array.isArray(value)) return 'array';\n if (value instanceof Object && value.constructor.name !== 'Object') {\n return value.constructor.name;\n }\n }\n\n return nativeType;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * validateDescriptionItems\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal\n * @description Descriptions must be functions (they're rendered as components so hooks can be used\n * inside them), not plain objects. Passing a plain object crashes deep inside\n * `DescriptionComponentRenderer` with an unhelpful `description is not a function` error, so we\n * validate eagerly here to fail fast with a clear message pointing at the offending API call.\n */\nconst validateDescriptionItems = (items: unknown[], apiName: string, argName: string): void => {\n items.forEach((item, index) => {\n if (typeof item !== 'function') {\n throw new Error(\n `Expected every item in the \\`${argName}\\` array passed to \\`${apiName}\\` to be a function that returns a description object, but received ${getPrintableType(\n item\n )} at index ${index}. Did you forget to wrap it in a function, e.g. \\`() => ({ ...yourAction })\\`?`\n );\n }\n });\n};\n\nexport { ContentManagerPlugin };\nexport type {\n EditViewContext,\n ListViewContext,\n BulkActionComponent,\n BulkActionComponentProps,\n BulkActionDescription,\n DescriptionComponent,\n DescriptionReducer,\n PanelComponentProps,\n PanelComponent,\n PanelDescription,\n DocumentActionComponent,\n DocumentActionDescription,\n DocumentActionProps,\n HeaderActionComponent,\n HeaderActionDescription,\n HeaderActionProps,\n};\n"],"names":["ContentManagerPlugin","addRichTextBlocks","blocks","result","richTextBlocksStore","Error","getPrintableType","addEditViewSidePanel","panels","Array","isArray","validateDescriptionItems","editViewSidePanels","addDocumentAction","actions","documentActions","addDocumentHeaderAction","headerActions","addBulkAction","bulkActions","config","id","PLUGIN_ID","name","injectionZones","INJECTION_ZONES","apis","bind","getBulkActions","getDocumentActions","position","filter","action","undefined","flat","includes","getEditViewSidePanels","getHeaderActions","getRichTextBlocks","defaultBlocksStore","DEFAULT_BULK_ACTIONS","DEFAULT_ACTIONS","DEFAULT_TABLE_ROW_ACTIONS","DEFAULT_HEADER_ACTIONS","ActionsPanel","value","nativeType","Object","items","apiName","argName","forEach","item","index"],"mappings":"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"}
@@ -2,6 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
+ require('prismjs');
5
6
  var Icons = require('@strapi/icons');
6
7
  var plugin = require('./constants/plugin.js');
7
8
  var contentManager = require('./content-manager.js');
@@ -10,7 +11,6 @@ var reducers = require('./modules/reducers.js');
10
11
  var index$2 = require('./preview/index.js');
11
12
  var router = require('./router.js');
12
13
  var translations = require('./utils/translations.js');
13
- require('prismjs');
14
14
  var api = require('./utils/api.js');
15
15
  var RelativeTime = require('./components/RelativeTime.js');
16
16
  var DocumentStatus = require('./pages/EditView/components/DocumentStatus.js');
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../admin/src/index.ts"],"sourcesContent":["import { CheckCircle, Feather, Pencil, PuzzlePiece } from '@strapi/icons';\n\nimport { PLUGIN_ID } from './constants/plugin';\nimport { ContentManagerPlugin } from './content-manager';\nimport { historyAdmin } from './history';\nimport { reducer } from './modules/reducers';\nimport { previewAdmin } from './preview';\nimport { routes } from './router';\nimport { prefixPluginTranslations } from './utils/translations';\n\nimport type { StrapiApp, WidgetArgs } from '@strapi/admin/strapi-admin';\n\n// NOTE: we have to preload it to ensure chunks will have it available as global\nimport 'prismjs';\n\n// eslint-disable-next-line import/no-default-export\nexport default {\n register(app: StrapiApp) {\n const cm = new ContentManagerPlugin();\n\n app.addReducers({\n [PLUGIN_ID]: reducer,\n });\n\n app.addMenuLink({\n to: PLUGIN_ID,\n icon: Feather,\n intlLabel: {\n id: `content-manager.plugin.name`,\n defaultMessage: 'Content Manager',\n },\n permissions: [],\n position: 1,\n });\n\n app.router.addRoute({\n path: 'content-manager/*',\n lazy: async () => {\n const { Layout } = await import('./layout');\n\n return {\n Component: Layout,\n };\n },\n children: routes,\n });\n\n app.registerPlugin(cm.config);\n\n app.widgets.register((widgets: WidgetArgs[]) => {\n const lastEditedWidget: WidgetArgs = {\n icon: Pencil,\n title: {\n id: `${PLUGIN_ID}.widget.last-edited.title`,\n defaultMessage: 'Last edited entries',\n },\n component: async () => {\n const { LastEditedWidget } = await import('./components/Widgets');\n return LastEditedWidget;\n },\n pluginId: PLUGIN_ID,\n id: 'last-edited-entries',\n permissions: [{ action: 'plugin::content-manager.explorer.read' }],\n };\n const lastPublishedWidget: WidgetArgs = {\n icon: CheckCircle,\n title: {\n id: `${PLUGIN_ID}.widget.last-published.title`,\n defaultMessage: 'Last published entries',\n },\n component: async () => {\n const { LastPublishedWidget } = await import('./components/Widgets');\n return LastPublishedWidget;\n },\n pluginId: PLUGIN_ID,\n id: 'last-published-entries',\n permissions: [{ action: 'plugin::content-manager.explorer.read' }],\n };\n const entriesWidget: WidgetArgs = {\n icon: PuzzlePiece,\n title: {\n id: `${PLUGIN_ID}.widget.chart-entries.title`,\n defaultMessage: 'Entries',\n },\n component: async () => {\n const { ChartEntriesWidget } = await import('./components/Widgets');\n return ChartEntriesWidget;\n },\n pluginId: PLUGIN_ID,\n id: 'chart-entries',\n permissions: [{ action: 'plugin::content-manager.explorer.read' }],\n };\n\n const profileInfoIndex = widgets.findIndex(\n (widget) => widget.id === 'profile-info' && widget.pluginId === 'admin'\n );\n\n // Insert chart-entries after the profile-info widget\n if (profileInfoIndex !== -1) {\n const newWidgets: WidgetArgs[] = [...widgets];\n newWidgets.splice(profileInfoIndex + 1, 0, entriesWidget);\n return [lastEditedWidget, lastPublishedWidget, ...newWidgets];\n }\n\n // Fallback: add to the end if the target widget aren't found\n return [lastEditedWidget, lastPublishedWidget, ...widgets, entriesWidget];\n });\n },\n bootstrap(app: StrapiApp) {\n if (typeof historyAdmin.bootstrap === 'function') {\n historyAdmin.bootstrap(app);\n }\n if (typeof previewAdmin.bootstrap === 'function') {\n previewAdmin.bootstrap(app);\n }\n },\n async registerTrads({ locales }: { locales: string[] }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, PLUGIN_ID),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n\nexport * from './exports';\n"],"names":["register","app","cm","ContentManagerPlugin","addReducers","PLUGIN_ID","reducer","addMenuLink","to","icon","Feather","intlLabel","id","defaultMessage","permissions","position","router","addRoute","path","lazy","Layout","Component","children","routes","registerPlugin","config","widgets","lastEditedWidget","Pencil","title","component","LastEditedWidget","pluginId","action","lastPublishedWidget","CheckCircle","LastPublishedWidget","entriesWidget","PuzzlePiece","ChartEntriesWidget","profileInfoIndex","findIndex","widget","newWidgets","splice","bootstrap","historyAdmin","previewAdmin","registerTrads","locales","importedTrads","Promise","all","map","locale","then","default","data","prefixPluginTranslations","catch","resolve"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../admin/src/index.ts"],"sourcesContent":["// NOTE: preload before content-manager so Blocks code-editor prism language plugins see global Prism.\nimport 'prismjs';\n\nimport { CheckCircle, Feather, Pencil, PuzzlePiece } from '@strapi/icons';\n\nimport { PLUGIN_ID } from './constants/plugin';\nimport { ContentManagerPlugin } from './content-manager';\nimport { historyAdmin } from './history';\nimport { reducer } from './modules/reducers';\nimport { previewAdmin } from './preview';\nimport { routes } from './router';\nimport { prefixPluginTranslations } from './utils/translations';\n\nimport type { StrapiApp, WidgetArgs } from '@strapi/admin/strapi-admin';\n\n// eslint-disable-next-line import/no-default-export\nexport default {\n register(app: StrapiApp) {\n const cm = new ContentManagerPlugin();\n\n app.addReducers({\n [PLUGIN_ID]: reducer,\n });\n\n app.addMenuLink({\n to: PLUGIN_ID,\n icon: Feather,\n intlLabel: {\n id: `content-manager.plugin.name`,\n defaultMessage: 'Content Manager',\n },\n permissions: [],\n position: 1,\n });\n\n app.router.addRoute({\n path: 'content-manager/*',\n lazy: async () => {\n const { Layout } = await import('./layout');\n\n return {\n Component: Layout,\n };\n },\n children: routes,\n });\n\n app.registerPlugin(cm.config);\n\n app.widgets.register((widgets: WidgetArgs[]) => {\n const lastEditedWidget: WidgetArgs = {\n icon: Pencil,\n title: {\n id: `${PLUGIN_ID}.widget.last-edited.title`,\n defaultMessage: 'Last edited entries',\n },\n component: async () => {\n const { LastEditedWidget } = await import('./components/Widgets');\n return LastEditedWidget;\n },\n pluginId: PLUGIN_ID,\n id: 'last-edited-entries',\n permissions: [{ action: 'plugin::content-manager.explorer.read' }],\n };\n const lastPublishedWidget: WidgetArgs = {\n icon: CheckCircle,\n title: {\n id: `${PLUGIN_ID}.widget.last-published.title`,\n defaultMessage: 'Last published entries',\n },\n component: async () => {\n const { LastPublishedWidget } = await import('./components/Widgets');\n return LastPublishedWidget;\n },\n pluginId: PLUGIN_ID,\n id: 'last-published-entries',\n permissions: [{ action: 'plugin::content-manager.explorer.read' }],\n };\n const entriesWidget: WidgetArgs = {\n icon: PuzzlePiece,\n title: {\n id: `${PLUGIN_ID}.widget.chart-entries.title`,\n defaultMessage: 'Entries',\n },\n component: async () => {\n const { ChartEntriesWidget } = await import('./components/Widgets');\n return ChartEntriesWidget;\n },\n pluginId: PLUGIN_ID,\n id: 'chart-entries',\n permissions: [{ action: 'plugin::content-manager.explorer.read' }],\n };\n\n const profileInfoIndex = widgets.findIndex(\n (widget) => widget.id === 'profile-info' && widget.pluginId === 'admin'\n );\n\n // Insert chart-entries after the profile-info widget\n if (profileInfoIndex !== -1) {\n const newWidgets: WidgetArgs[] = [...widgets];\n newWidgets.splice(profileInfoIndex + 1, 0, entriesWidget);\n return [lastEditedWidget, lastPublishedWidget, ...newWidgets];\n }\n\n // Fallback: add to the end if the target widget aren't found\n return [lastEditedWidget, lastPublishedWidget, ...widgets, entriesWidget];\n });\n },\n bootstrap(app: StrapiApp) {\n if (typeof historyAdmin.bootstrap === 'function') {\n historyAdmin.bootstrap(app);\n }\n if (typeof previewAdmin.bootstrap === 'function') {\n previewAdmin.bootstrap(app);\n }\n },\n async registerTrads({ locales }: { locales: string[] }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, PLUGIN_ID),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n\nexport * from './exports';\n"],"names":["register","app","cm","ContentManagerPlugin","addReducers","PLUGIN_ID","reducer","addMenuLink","to","icon","Feather","intlLabel","id","defaultMessage","permissions","position","router","addRoute","path","lazy","Layout","Component","children","routes","registerPlugin","config","widgets","lastEditedWidget","Pencil","title","component","LastEditedWidget","pluginId","action","lastPublishedWidget","CheckCircle","LastPublishedWidget","entriesWidget","PuzzlePiece","ChartEntriesWidget","profileInfoIndex","findIndex","widget","newWidgets","splice","bootstrap","historyAdmin","previewAdmin","registerTrads","locales","importedTrads","Promise","all","map","locale","then","default","data","prefixPluginTranslations","catch","resolve"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import 'prismjs';
1
2
  import { Feather, Pencil, CheckCircle, PuzzlePiece } from '@strapi/icons';
2
3
  import { PLUGIN_ID } from './constants/plugin.mjs';
3
4
  import { ContentManagerPlugin } from './content-manager.mjs';
@@ -6,7 +7,6 @@ import { reducer } from './modules/reducers.mjs';
6
7
  import { previewAdmin } from './preview/index.mjs';
7
8
  import { routes } from './router.mjs';
8
9
  import { prefixPluginTranslations } from './utils/translations.mjs';
9
- import 'prismjs';
10
10
  export { buildValidParams } from './utils/api.mjs';
11
11
  export { RelativeTime } from './components/RelativeTime.mjs';
12
12
  export { DocumentStatus } from './pages/EditView/components/DocumentStatus.mjs';
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../admin/src/index.ts"],"sourcesContent":["import { CheckCircle, Feather, Pencil, PuzzlePiece } from '@strapi/icons';\n\nimport { PLUGIN_ID } from './constants/plugin';\nimport { ContentManagerPlugin } from './content-manager';\nimport { historyAdmin } from './history';\nimport { reducer } from './modules/reducers';\nimport { previewAdmin } from './preview';\nimport { routes } from './router';\nimport { prefixPluginTranslations } from './utils/translations';\n\nimport type { StrapiApp, WidgetArgs } from '@strapi/admin/strapi-admin';\n\n// NOTE: we have to preload it to ensure chunks will have it available as global\nimport 'prismjs';\n\n// eslint-disable-next-line import/no-default-export\nexport default {\n register(app: StrapiApp) {\n const cm = new ContentManagerPlugin();\n\n app.addReducers({\n [PLUGIN_ID]: reducer,\n });\n\n app.addMenuLink({\n to: PLUGIN_ID,\n icon: Feather,\n intlLabel: {\n id: `content-manager.plugin.name`,\n defaultMessage: 'Content Manager',\n },\n permissions: [],\n position: 1,\n });\n\n app.router.addRoute({\n path: 'content-manager/*',\n lazy: async () => {\n const { Layout } = await import('./layout');\n\n return {\n Component: Layout,\n };\n },\n children: routes,\n });\n\n app.registerPlugin(cm.config);\n\n app.widgets.register((widgets: WidgetArgs[]) => {\n const lastEditedWidget: WidgetArgs = {\n icon: Pencil,\n title: {\n id: `${PLUGIN_ID}.widget.last-edited.title`,\n defaultMessage: 'Last edited entries',\n },\n component: async () => {\n const { LastEditedWidget } = await import('./components/Widgets');\n return LastEditedWidget;\n },\n pluginId: PLUGIN_ID,\n id: 'last-edited-entries',\n permissions: [{ action: 'plugin::content-manager.explorer.read' }],\n };\n const lastPublishedWidget: WidgetArgs = {\n icon: CheckCircle,\n title: {\n id: `${PLUGIN_ID}.widget.last-published.title`,\n defaultMessage: 'Last published entries',\n },\n component: async () => {\n const { LastPublishedWidget } = await import('./components/Widgets');\n return LastPublishedWidget;\n },\n pluginId: PLUGIN_ID,\n id: 'last-published-entries',\n permissions: [{ action: 'plugin::content-manager.explorer.read' }],\n };\n const entriesWidget: WidgetArgs = {\n icon: PuzzlePiece,\n title: {\n id: `${PLUGIN_ID}.widget.chart-entries.title`,\n defaultMessage: 'Entries',\n },\n component: async () => {\n const { ChartEntriesWidget } = await import('./components/Widgets');\n return ChartEntriesWidget;\n },\n pluginId: PLUGIN_ID,\n id: 'chart-entries',\n permissions: [{ action: 'plugin::content-manager.explorer.read' }],\n };\n\n const profileInfoIndex = widgets.findIndex(\n (widget) => widget.id === 'profile-info' && widget.pluginId === 'admin'\n );\n\n // Insert chart-entries after the profile-info widget\n if (profileInfoIndex !== -1) {\n const newWidgets: WidgetArgs[] = [...widgets];\n newWidgets.splice(profileInfoIndex + 1, 0, entriesWidget);\n return [lastEditedWidget, lastPublishedWidget, ...newWidgets];\n }\n\n // Fallback: add to the end if the target widget aren't found\n return [lastEditedWidget, lastPublishedWidget, ...widgets, entriesWidget];\n });\n },\n bootstrap(app: StrapiApp) {\n if (typeof historyAdmin.bootstrap === 'function') {\n historyAdmin.bootstrap(app);\n }\n if (typeof previewAdmin.bootstrap === 'function') {\n previewAdmin.bootstrap(app);\n }\n },\n async registerTrads({ locales }: { locales: string[] }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, PLUGIN_ID),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n\nexport * from './exports';\n"],"names":["register","app","cm","ContentManagerPlugin","addReducers","PLUGIN_ID","reducer","addMenuLink","to","icon","Feather","intlLabel","id","defaultMessage","permissions","position","router","addRoute","path","lazy","Layout","Component","children","routes","registerPlugin","config","widgets","lastEditedWidget","Pencil","title","component","LastEditedWidget","pluginId","action","lastPublishedWidget","CheckCircle","LastPublishedWidget","entriesWidget","PuzzlePiece","ChartEntriesWidget","profileInfoIndex","findIndex","widget","newWidgets","splice","bootstrap","historyAdmin","previewAdmin","registerTrads","locales","importedTrads","Promise","all","map","locale","then","default","data","prefixPluginTranslations","catch","resolve"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../admin/src/index.ts"],"sourcesContent":["// NOTE: preload before content-manager so Blocks code-editor prism language plugins see global Prism.\nimport 'prismjs';\n\nimport { CheckCircle, Feather, Pencil, PuzzlePiece } from '@strapi/icons';\n\nimport { PLUGIN_ID } from './constants/plugin';\nimport { ContentManagerPlugin } from './content-manager';\nimport { historyAdmin } from './history';\nimport { reducer } from './modules/reducers';\nimport { previewAdmin } from './preview';\nimport { routes } from './router';\nimport { prefixPluginTranslations } from './utils/translations';\n\nimport type { StrapiApp, WidgetArgs } from '@strapi/admin/strapi-admin';\n\n// eslint-disable-next-line import/no-default-export\nexport default {\n register(app: StrapiApp) {\n const cm = new ContentManagerPlugin();\n\n app.addReducers({\n [PLUGIN_ID]: reducer,\n });\n\n app.addMenuLink({\n to: PLUGIN_ID,\n icon: Feather,\n intlLabel: {\n id: `content-manager.plugin.name`,\n defaultMessage: 'Content Manager',\n },\n permissions: [],\n position: 1,\n });\n\n app.router.addRoute({\n path: 'content-manager/*',\n lazy: async () => {\n const { Layout } = await import('./layout');\n\n return {\n Component: Layout,\n };\n },\n children: routes,\n });\n\n app.registerPlugin(cm.config);\n\n app.widgets.register((widgets: WidgetArgs[]) => {\n const lastEditedWidget: WidgetArgs = {\n icon: Pencil,\n title: {\n id: `${PLUGIN_ID}.widget.last-edited.title`,\n defaultMessage: 'Last edited entries',\n },\n component: async () => {\n const { LastEditedWidget } = await import('./components/Widgets');\n return LastEditedWidget;\n },\n pluginId: PLUGIN_ID,\n id: 'last-edited-entries',\n permissions: [{ action: 'plugin::content-manager.explorer.read' }],\n };\n const lastPublishedWidget: WidgetArgs = {\n icon: CheckCircle,\n title: {\n id: `${PLUGIN_ID}.widget.last-published.title`,\n defaultMessage: 'Last published entries',\n },\n component: async () => {\n const { LastPublishedWidget } = await import('./components/Widgets');\n return LastPublishedWidget;\n },\n pluginId: PLUGIN_ID,\n id: 'last-published-entries',\n permissions: [{ action: 'plugin::content-manager.explorer.read' }],\n };\n const entriesWidget: WidgetArgs = {\n icon: PuzzlePiece,\n title: {\n id: `${PLUGIN_ID}.widget.chart-entries.title`,\n defaultMessage: 'Entries',\n },\n component: async () => {\n const { ChartEntriesWidget } = await import('./components/Widgets');\n return ChartEntriesWidget;\n },\n pluginId: PLUGIN_ID,\n id: 'chart-entries',\n permissions: [{ action: 'plugin::content-manager.explorer.read' }],\n };\n\n const profileInfoIndex = widgets.findIndex(\n (widget) => widget.id === 'profile-info' && widget.pluginId === 'admin'\n );\n\n // Insert chart-entries after the profile-info widget\n if (profileInfoIndex !== -1) {\n const newWidgets: WidgetArgs[] = [...widgets];\n newWidgets.splice(profileInfoIndex + 1, 0, entriesWidget);\n return [lastEditedWidget, lastPublishedWidget, ...newWidgets];\n }\n\n // Fallback: add to the end if the target widget aren't found\n return [lastEditedWidget, lastPublishedWidget, ...widgets, entriesWidget];\n });\n },\n bootstrap(app: StrapiApp) {\n if (typeof historyAdmin.bootstrap === 'function') {\n historyAdmin.bootstrap(app);\n }\n if (typeof previewAdmin.bootstrap === 'function') {\n previewAdmin.bootstrap(app);\n }\n },\n async registerTrads({ locales }: { locales: string[] }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, PLUGIN_ID),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n\nexport * from './exports';\n"],"names":["register","app","cm","ContentManagerPlugin","addReducers","PLUGIN_ID","reducer","addMenuLink","to","icon","Feather","intlLabel","id","defaultMessage","permissions","position","router","addRoute","path","lazy","Layout","Component","children","routes","registerPlugin","config","widgets","lastEditedWidget","Pencil","title","component","LastEditedWidget","pluginId","action","lastPublishedWidget","CheckCircle","LastPublishedWidget","entriesWidget","PuzzlePiece","ChartEntriesWidget","profileInfoIndex","findIndex","widget","newWidgets","splice","bootstrap","historyAdmin","previewAdmin","registerTrads","locales","importedTrads","Promise","all","map","locale","then","default","data","prefixPluginTranslations","catch","resolve"],"mappings":"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"}
@@ -60,7 +60,7 @@ function useBlocksEditorContext(consumerName) {
60
60
  * Because it would force a rerender of the entire editor every time the user types a character.
61
61
  * Why not use the entity id as the key, since it's unique for each locale?
62
62
  * Because it would not solve the problem when using the "fill in from other locale" feature
63
- */ function useResetKey(value) {
63
+ */ function useResetKey(editor, value) {
64
64
  // Keep track how many times Slate detected a change from a user interaction in the editor
65
65
  const slateUpdatesCount = React__namespace.useRef(0);
66
66
  // Keep track of how many times the value prop was updated, whether from within editor or from outside
@@ -71,13 +71,29 @@ function useBlocksEditorContext(consumerName) {
71
71
  valueUpdatesCount.current += 1;
72
72
  // If the 2 refs are not equal, it means the value was updated from outside
73
73
  if (valueUpdatesCount.current !== slateUpdatesCount.current) {
74
- // So we change the key to force a rerender of the Slate editor,
74
+ // Bring the 2 refs back in sync
75
+ slateUpdatesCount.current = valueUpdatesCount.current;
76
+ // The update may just be an echo of the editor's own content coming back through the form
77
+ // (e.g. the debounced sync, or a re-render while document queries settle). Remounting in
78
+ // that case is pointless and destructive: it wipes pending input and the DOM under the
79
+ // user's caret. Only force a remount when the content is actually different.
80
+ const externalState = value?.length ? normalizeBlocksState(editor, value) : null;
81
+ const editorState = normalizeBlocksState(editor, editor.children);
82
+ if (JSON.stringify(externalState) === JSON.stringify(editorState)) {
83
+ return;
84
+ }
85
+ // The remount reuses the same editor instance, so a selection pointing into the old
86
+ // content would survive it and crash slate-react's toDOMPoint when the new content is
87
+ // shorter. Drop the selection before swapping the children.
88
+ if (editor.selection) {
89
+ slate.Transforms.deselect(editor);
90
+ }
91
+ // Change the key to force a rerender of the Slate editor,
75
92
  // which will pick up the new value through its initialValue prop
76
93
  setKey((previousKey)=>previousKey + 1);
77
- // Then bring the 2 refs back in sync
78
- slateUpdatesCount.current = valueUpdatesCount.current;
79
94
  }
80
95
  }, [
96
+ editor,
81
97
  value
82
98
  ]);
83
99
  const incrementSlateUpdatesCount = React__namespace.useCallback(()=>{
@@ -116,7 +132,7 @@ const BlocksEditor = /*#__PURE__*/ React__namespace.forwardRef(({ disabled = fal
116
132
  }), [
117
133
  editor
118
134
  ]);
119
- const { key, incrementSlateUpdatesCount } = useResetKey(value);
135
+ const { key, incrementSlateUpdatesCount } = useResetKey(editor, value);
120
136
  const debounceTimeout = React__namespace.useRef(null);
121
137
  const flushPendingFormSync = React__namespace.useCallback(()=>{
122
138
  if (!debounceTimeout.current) {
@@ -124,14 +140,13 @@ const BlocksEditor = /*#__PURE__*/ React__namespace.forwardRef(({ disabled = fal
124
140
  }
125
141
  clearTimeout(debounceTimeout.current);
126
142
  debounceTimeout.current = null;
127
- incrementSlateUpdatesCount();
143
+ // Counter was already bumped when the AST changed; only push form state here.
128
144
  // Ensure Strapi Form state updates before the next event (e.g. Save click) reads values.
129
145
  reactDom.flushSync(()=>{
130
146
  onChange(name, normalizeBlocksState(editor, editor.children));
131
147
  });
132
148
  }, [
133
149
  editor,
134
- incrementSlateUpdatesCount,
135
150
  name,
136
151
  onChange
137
152
  ]);
@@ -143,12 +158,17 @@ const BlocksEditor = /*#__PURE__*/ React__namespace.forwardRef(({ disabled = fal
143
158
  * state in sync with it in order to make sure that things like the "modified" state
144
159
  * isn't broken. Updating the whole state on every change is very expensive however,
145
160
  * so we debounce calls to onChange to mitigate input lag.
146
- */ if (debounceTimeout.current) {
161
+ *
162
+ * Bump the reset-key counter immediately (not inside the debounce). Otherwise any
163
+ * value-prop identity change during the 300ms window — e.g. clicking the blocks
164
+ * toolbar — looks like an external update with stale empty form state and remounts
165
+ * the editor, wiping the pending input (blocks e2e flake).
166
+ */ incrementSlateUpdatesCount();
167
+ if (debounceTimeout.current) {
147
168
  clearTimeout(debounceTimeout.current);
148
169
  }
149
170
  // Set a new debounce timeout
150
171
  debounceTimeout.current = setTimeout(()=>{
151
- incrementSlateUpdatesCount();
152
172
  // Normalize the state (empty editor becomes null)
153
173
  onChange(name, normalizeBlocksState(editor, state));
154
174
  debounceTimeout.current = null;