@strapi/content-manager 5.45.1 → 5.46.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 (70) hide show
  1. package/dist/admin/content-manager.js +26 -2
  2. package/dist/admin/content-manager.js.map +1 -1
  3. package/dist/admin/content-manager.mjs +26 -2
  4. package/dist/admin/content-manager.mjs.map +1 -1
  5. package/dist/admin/hooks/usePersistentQueryParams.js +4 -1
  6. package/dist/admin/hooks/usePersistentQueryParams.js.map +1 -1
  7. package/dist/admin/hooks/usePersistentQueryParams.mjs +4 -1
  8. package/dist/admin/hooks/usePersistentQueryParams.mjs.map +1 -1
  9. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.js +21 -4
  10. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.js.map +1 -1
  11. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.mjs +19 -2
  12. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.mjs.map +1 -1
  13. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.mjs +1 -1
  14. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +9 -6
  15. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
  16. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs +10 -7
  17. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs.map +1 -1
  18. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js +1 -34
  19. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
  20. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs +3 -35
  21. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs.map +1 -1
  22. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js +33 -18
  23. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
  24. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs +34 -19
  25. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs.map +1 -1
  26. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/DefaultBlocksStore.js +22 -0
  27. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/DefaultBlocksStore.js.map +1 -0
  28. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/DefaultBlocksStore.mjs +20 -0
  29. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/DefaultBlocksStore.mjs.map +1 -0
  30. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +15 -4
  31. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
  32. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +16 -5
  33. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
  34. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +26 -4
  35. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  36. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +26 -4
  37. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  38. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +31 -0
  39. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
  40. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +31 -0
  41. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
  42. package/dist/admin/preview/components/InputPopover.js +3 -0
  43. package/dist/admin/preview/components/InputPopover.js.map +1 -1
  44. package/dist/admin/preview/components/InputPopover.mjs +3 -0
  45. package/dist/admin/preview/components/InputPopover.mjs.map +1 -1
  46. package/dist/admin/preview/hooks/usePreviewInputManager.js +24 -0
  47. package/dist/admin/preview/hooks/usePreviewInputManager.js.map +1 -1
  48. package/dist/admin/preview/hooks/usePreviewInputManager.mjs +24 -0
  49. package/dist/admin/preview/hooks/usePreviewInputManager.mjs.map +1 -1
  50. package/dist/admin/preview/utils/previewScript.js +616 -78
  51. package/dist/admin/preview/utils/previewScript.js.map +1 -1
  52. package/dist/admin/preview/utils/previewScript.mjs +616 -78
  53. package/dist/admin/preview/utils/previewScript.mjs.map +1 -1
  54. package/dist/admin/src/content-manager.d.ts +26 -0
  55. package/dist/admin/src/exports.d.ts +1 -0
  56. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.d.ts +14 -8
  57. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/DefaultBlocksStore.d.ts +3 -0
  58. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentCard.d.ts +1 -1
  59. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +11 -1
  60. package/dist/server/homepage/services/homepage.js +12 -8
  61. package/dist/server/homepage/services/homepage.js.map +1 -1
  62. package/dist/server/homepage/services/homepage.mjs +12 -8
  63. package/dist/server/homepage/services/homepage.mjs.map +1 -1
  64. package/dist/server/services/metrics.js +1 -5
  65. package/dist/server/services/metrics.js.map +1 -1
  66. package/dist/server/services/metrics.mjs +1 -5
  67. package/dist/server/services/metrics.mjs.map +1 -1
  68. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
  69. package/dist/server/src/services/metrics.d.ts.map +1 -1
  70. package/package.json +6 -6
@@ -3,6 +3,7 @@
3
3
  var InjectionZone = require('./components/InjectionZone.js');
4
4
  var plugin = require('./constants/plugin.js');
5
5
  var DocumentActions = require('./pages/EditView/components/DocumentActions.js');
6
+ var DefaultBlocksStore = require('./pages/EditView/components/FormInputs/BlocksInput/DefaultBlocksStore.js');
6
7
  var Header = require('./pages/EditView/components/Header.js');
7
8
  var Panels = require('./pages/EditView/components/Panels.js');
8
9
  var Actions = require('./pages/ListView/components/BulkActions/Actions.js');
@@ -11,6 +12,22 @@ var TableActions = require('./pages/ListView/components/TableActions.js');
11
12
  /* -------------------------------------------------------------------------------------------------
12
13
  * ContentManager plugin
13
14
  * -----------------------------------------------------------------------------------------------*/ class ContentManagerPlugin {
15
+ addRichTextBlocks(blocks) {
16
+ if (typeof blocks === 'function') {
17
+ const result = blocks(this.richTextBlocksStore);
18
+ if (typeof result !== 'object' || result === null) {
19
+ throw new Error(`Expected the \`blocks\` passed to \`addRichTextBlocks\` to be an object or a function, but received ${getPrintableType(result)}`);
20
+ }
21
+ this.richTextBlocksStore = result;
22
+ } else if (typeof blocks === 'object') {
23
+ this.richTextBlocksStore = {
24
+ ...this.richTextBlocksStore,
25
+ ...blocks
26
+ };
27
+ } else {
28
+ throw new Error(`Expected the \`blocks\` passed to \`addRichTextBlocks\` to be an object or a function, but received ${getPrintableType(blocks)}`);
29
+ }
30
+ }
14
31
  addEditViewSidePanel(panels) {
15
32
  if (Array.isArray(panels)) {
16
33
  this.editViewSidePanels = [
@@ -69,6 +86,7 @@ var TableActions = require('./pages/ListView/components/TableActions.js');
69
86
  addDocumentAction: this.addDocumentAction.bind(this),
70
87
  addDocumentHeaderAction: this.addDocumentHeaderAction.bind(this),
71
88
  addEditViewSidePanel: this.addEditViewSidePanel.bind(this),
89
+ addRichTextBlocks: this.addRichTextBlocks.bind(this),
72
90
  getBulkActions: ()=>this.bulkActions,
73
91
  getDocumentActions: (position)=>{
74
92
  /**
@@ -87,7 +105,10 @@ var TableActions = require('./pages/ListView/components/TableActions.js');
87
105
  return this.documentActions;
88
106
  },
89
107
  getEditViewSidePanels: ()=>this.editViewSidePanels,
90
- getHeaderActions: ()=>this.headerActions
108
+ getHeaderActions: ()=>this.headerActions,
109
+ getRichTextBlocks: ()=>({
110
+ ...this.richTextBlocksStore
111
+ })
91
112
  }
92
113
  };
93
114
  }
@@ -97,7 +118,10 @@ var TableActions = require('./pages/ListView/components/TableActions.js');
97
118
  * the content-manager. The function calls however, need to be called at runtime in the
98
119
  * application, so instead we collate them and run them later with the complete list incl.
99
120
  * ones already registered & the context of the view.
100
- */ this.bulkActions = [
121
+ */ this.richTextBlocksStore = {
122
+ ...DefaultBlocksStore.defaultBlocksStore
123
+ };
124
+ this.bulkActions = [
101
125
  ...Actions.DEFAULT_BULK_ACTIONS
102
126
  ];
103
127
  this.documentActions = [
@@ -1 +1 @@
1
- {"version":3,"file":"content-manager.js","sources":["../../admin/src/content-manager.ts"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\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 {\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[];\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 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 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 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 },\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","addEditViewSidePanel","panels","Array","isArray","editViewSidePanels","Error","getPrintableType","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","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.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":"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"}
@@ -1,6 +1,7 @@
1
1
  import { INJECTION_ZONES } from './components/InjectionZone.mjs';
2
2
  import { PLUGIN_ID } from './constants/plugin.mjs';
3
3
  import { DEFAULT_ACTIONS } from './pages/EditView/components/DocumentActions.mjs';
4
+ import { defaultBlocksStore } from './pages/EditView/components/FormInputs/BlocksInput/DefaultBlocksStore.mjs';
4
5
  import { DEFAULT_HEADER_ACTIONS } from './pages/EditView/components/Header.mjs';
5
6
  import { ActionsPanel } from './pages/EditView/components/Panels.mjs';
6
7
  import { DEFAULT_BULK_ACTIONS } from './pages/ListView/components/BulkActions/Actions.mjs';
@@ -9,6 +10,22 @@ import { DEFAULT_TABLE_ROW_ACTIONS } from './pages/ListView/components/TableActi
9
10
  /* -------------------------------------------------------------------------------------------------
10
11
  * ContentManager plugin
11
12
  * -----------------------------------------------------------------------------------------------*/ class ContentManagerPlugin {
13
+ addRichTextBlocks(blocks) {
14
+ if (typeof blocks === 'function') {
15
+ const result = blocks(this.richTextBlocksStore);
16
+ if (typeof result !== 'object' || result === null) {
17
+ throw new Error(`Expected the \`blocks\` passed to \`addRichTextBlocks\` to be an object or a function, but received ${getPrintableType(result)}`);
18
+ }
19
+ this.richTextBlocksStore = result;
20
+ } else if (typeof blocks === 'object') {
21
+ this.richTextBlocksStore = {
22
+ ...this.richTextBlocksStore,
23
+ ...blocks
24
+ };
25
+ } else {
26
+ throw new Error(`Expected the \`blocks\` passed to \`addRichTextBlocks\` to be an object or a function, but received ${getPrintableType(blocks)}`);
27
+ }
28
+ }
12
29
  addEditViewSidePanel(panels) {
13
30
  if (Array.isArray(panels)) {
14
31
  this.editViewSidePanels = [
@@ -67,6 +84,7 @@ import { DEFAULT_TABLE_ROW_ACTIONS } from './pages/ListView/components/TableActi
67
84
  addDocumentAction: this.addDocumentAction.bind(this),
68
85
  addDocumentHeaderAction: this.addDocumentHeaderAction.bind(this),
69
86
  addEditViewSidePanel: this.addEditViewSidePanel.bind(this),
87
+ addRichTextBlocks: this.addRichTextBlocks.bind(this),
70
88
  getBulkActions: ()=>this.bulkActions,
71
89
  getDocumentActions: (position)=>{
72
90
  /**
@@ -85,7 +103,10 @@ import { DEFAULT_TABLE_ROW_ACTIONS } from './pages/ListView/components/TableActi
85
103
  return this.documentActions;
86
104
  },
87
105
  getEditViewSidePanels: ()=>this.editViewSidePanels,
88
- getHeaderActions: ()=>this.headerActions
106
+ getHeaderActions: ()=>this.headerActions,
107
+ getRichTextBlocks: ()=>({
108
+ ...this.richTextBlocksStore
109
+ })
89
110
  }
90
111
  };
91
112
  }
@@ -95,7 +116,10 @@ import { DEFAULT_TABLE_ROW_ACTIONS } from './pages/ListView/components/TableActi
95
116
  * the content-manager. The function calls however, need to be called at runtime in the
96
117
  * application, so instead we collate them and run them later with the complete list incl.
97
118
  * ones already registered & the context of the view.
98
- */ this.bulkActions = [
119
+ */ this.richTextBlocksStore = {
120
+ ...defaultBlocksStore
121
+ };
122
+ this.bulkActions = [
99
123
  ...DEFAULT_BULK_ACTIONS
100
124
  ];
101
125
  this.documentActions = [
@@ -1 +1 @@
1
- {"version":3,"file":"content-manager.mjs","sources":["../../admin/src/content-manager.ts"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\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 {\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[];\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 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 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 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 },\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","addEditViewSidePanel","panels","Array","isArray","editViewSidePanels","Error","getPrintableType","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","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 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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"}
@@ -62,7 +62,10 @@ const usePersistentPartialQueryParams = (config)=>{
62
62
  for (const [keyPrefix, entry] of Object.entries(config)){
63
63
  const { key, paths } = normalizeConfigEntry(keyPrefix, entry, scope);
64
64
  const paramsToPersist = filterObjectKeys(query, paths);
65
- if (Object.keys(paramsToPersist).length === 0) continue;
65
+ if (Object.keys(paramsToPersist).length === 0) {
66
+ window.localStorage.removeItem(key);
67
+ continue;
68
+ }
66
69
  window.localStorage.setItem(key, JSON.stringify(paramsToPersist));
67
70
  }
68
71
  // eslint-disable-next-line react-hooks/exhaustive-deps
@@ -1 +1 @@
1
- {"version":3,"file":"usePersistentQueryParams.js","sources":["../../../admin/src/hooks/usePersistentQueryParams.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport { usePersistentStateScope, useQueryParams } from '@strapi/admin/strapi-admin';\nimport get from 'lodash/get';\nimport set from 'lodash/set';\n\ntype PropertyPath = Parameters<typeof get>[1];\n\ninterface PersistentQueryConfigEntry {\n paths: PropertyPath[];\n scoped?: boolean;\n}\n\nconst filterObjectKeys = (obj: object, keys: PropertyPath[]) => {\n const result: Record<string, unknown> = {};\n\n for (const path of keys) {\n const value = get(obj, path);\n\n if (value !== undefined) {\n set(result, path, value);\n }\n }\n\n return result;\n};\n\nexport type PersistentQueryConfig = Record<string, PersistentQueryConfigEntry>;\n\nconst normalizeConfigEntry = (\n key: string,\n entry: PersistentQueryConfigEntry,\n scope: string | false | undefined\n) => {\n const { paths } = entry;\n const isScoped = entry.scoped === true && !!scope;\n\n return {\n key: isScoped ? `${key}:${scope}` : key,\n paths,\n };\n};\n\nexport const usePersistentPartialQueryParams = (config: PersistentQueryConfig) => {\n const scope = usePersistentStateScope();\n const [{ query }, setQuery] = useQueryParams();\n const clonedConfig = JSON.stringify(config);\n const [isHydrated, setIsHydrated] = useState(false);\n\n // load query params from local storge\n useEffect(() => {\n const mergedFilteredQuery: Record<string, unknown> = {};\n\n for (const [keyPrefix, entry] of Object.entries(config)) {\n const { key, paths } = normalizeConfigEntry(keyPrefix, entry, scope);\n\n const savedQueryParams = window.localStorage.getItem(key);\n if (!savedQueryParams) continue;\n\n let parsedSavedParams: Record<string, unknown>;\n try {\n parsedSavedParams = JSON.parse(savedQueryParams);\n } catch {\n continue;\n }\n if (Object.keys(parsedSavedParams).length === 0) continue;\n\n const filteredQuery = filterObjectKeys(parsedSavedParams, paths);\n Object.assign(mergedFilteredQuery, filteredQuery);\n }\n\n if (Object.keys(mergedFilteredQuery).length > 0) {\n setQuery({ ...mergedFilteredQuery, ...query }, 'push', true);\n }\n setIsHydrated(true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [clonedConfig, scope]);\n\n // update local storage\n useEffect(() => {\n for (const [keyPrefix, entry] of Object.entries(config)) {\n const { key, paths } = normalizeConfigEntry(keyPrefix, entry, scope);\n\n const paramsToPersist = filterObjectKeys(query, paths);\n if (Object.keys(paramsToPersist).length === 0) continue;\n window.localStorage.setItem(key, JSON.stringify(paramsToPersist));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [query, clonedConfig, scope]);\n\n return { isHydrated };\n};\n"],"names":["filterObjectKeys","obj","keys","result","path","value","get","undefined","set","normalizeConfigEntry","key","entry","scope","paths","isScoped","scoped","usePersistentPartialQueryParams","config","usePersistentStateScope","query","setQuery","useQueryParams","clonedConfig","JSON","stringify","isHydrated","setIsHydrated","useState","useEffect","mergedFilteredQuery","keyPrefix","Object","entries","savedQueryParams","window","localStorage","getItem","parsedSavedParams","parse","length","filteredQuery","assign","paramsToPersist","setItem"],"mappings":"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"}
1
+ {"version":3,"file":"usePersistentQueryParams.js","sources":["../../../admin/src/hooks/usePersistentQueryParams.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport { usePersistentStateScope, useQueryParams } from '@strapi/admin/strapi-admin';\nimport get from 'lodash/get';\nimport set from 'lodash/set';\n\ntype PropertyPath = Parameters<typeof get>[1];\n\ninterface PersistentQueryConfigEntry {\n paths: PropertyPath[];\n scoped?: boolean;\n}\n\nconst filterObjectKeys = (obj: object, keys: PropertyPath[]) => {\n const result: Record<string, unknown> = {};\n\n for (const path of keys) {\n const value = get(obj, path);\n\n if (value !== undefined) {\n set(result, path, value);\n }\n }\n\n return result;\n};\n\nexport type PersistentQueryConfig = Record<string, PersistentQueryConfigEntry>;\n\nconst normalizeConfigEntry = (\n key: string,\n entry: PersistentQueryConfigEntry,\n scope: string | false | undefined\n) => {\n const { paths } = entry;\n const isScoped = entry.scoped === true && !!scope;\n\n return {\n key: isScoped ? `${key}:${scope}` : key,\n paths,\n };\n};\n\nexport const usePersistentPartialQueryParams = (config: PersistentQueryConfig) => {\n const scope = usePersistentStateScope();\n const [{ query }, setQuery] = useQueryParams();\n const clonedConfig = JSON.stringify(config);\n const [isHydrated, setIsHydrated] = useState(false);\n\n // load query params from local storge\n useEffect(() => {\n const mergedFilteredQuery: Record<string, unknown> = {};\n\n for (const [keyPrefix, entry] of Object.entries(config)) {\n const { key, paths } = normalizeConfigEntry(keyPrefix, entry, scope);\n\n const savedQueryParams = window.localStorage.getItem(key);\n if (!savedQueryParams) continue;\n\n let parsedSavedParams: Record<string, unknown>;\n try {\n parsedSavedParams = JSON.parse(savedQueryParams);\n } catch {\n continue;\n }\n if (Object.keys(parsedSavedParams).length === 0) continue;\n\n const filteredQuery = filterObjectKeys(parsedSavedParams, paths);\n Object.assign(mergedFilteredQuery, filteredQuery);\n }\n\n if (Object.keys(mergedFilteredQuery).length > 0) {\n setQuery({ ...mergedFilteredQuery, ...query }, 'push', true);\n }\n setIsHydrated(true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [clonedConfig, scope]);\n\n // update local storage\n useEffect(() => {\n for (const [keyPrefix, entry] of Object.entries(config)) {\n const { key, paths } = normalizeConfigEntry(keyPrefix, entry, scope);\n\n const paramsToPersist = filterObjectKeys(query, paths);\n if (Object.keys(paramsToPersist).length === 0) {\n window.localStorage.removeItem(key);\n continue;\n }\n\n window.localStorage.setItem(key, JSON.stringify(paramsToPersist));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [query, clonedConfig, scope]);\n\n return { isHydrated };\n};\n"],"names":["filterObjectKeys","obj","keys","result","path","value","get","undefined","set","normalizeConfigEntry","key","entry","scope","paths","isScoped","scoped","usePersistentPartialQueryParams","config","usePersistentStateScope","query","setQuery","useQueryParams","clonedConfig","JSON","stringify","isHydrated","setIsHydrated","useState","useEffect","mergedFilteredQuery","keyPrefix","Object","entries","savedQueryParams","window","localStorage","getItem","parsedSavedParams","parse","length","filteredQuery","assign","paramsToPersist","removeItem","setItem"],"mappings":";;;;;;;AAaA,MAAMA,gBAAAA,GAAmB,CAACC,GAAAA,EAAaC,IAAAA,GAAAA;AACrC,IAAA,MAAMC,SAAkC,EAAC;IAEzC,KAAK,MAAMC,QAAQF,IAAAA,CAAM;QACvB,MAAMG,KAAAA,GAAQC,IAAIL,GAAAA,EAAKG,IAAAA,CAAAA;AAEvB,QAAA,IAAIC,UAAUE,SAAAA,EAAW;AACvBC,YAAAA,GAAAA,CAAIL,QAAQC,IAAAA,EAAMC,KAAAA,CAAAA;AACpB,QAAA;AACF,IAAA;IAEA,OAAOF,MAAAA;AACT,CAAA;AAIA,MAAMM,oBAAAA,GAAuB,CAC3BC,GAAAA,EACAC,KAAAA,EACAC,KAAAA,GAAAA;IAEA,MAAM,EAAEC,KAAK,EAAE,GAAGF,KAAAA;AAClB,IAAA,MAAMG,WAAWH,KAAAA,CAAMI,MAAM,KAAK,IAAA,IAAQ,CAAC,CAACH,KAAAA;IAE5C,OAAO;AACLF,QAAAA,GAAAA,EAAKI,WAAW,CAAA,EAAGJ,GAAAA,CAAI,CAAC,EAAEE,OAAO,GAAGF,GAAAA;AACpCG,QAAAA;AACF,KAAA;AACF,CAAA;AAEO,MAAMG,kCAAkC,CAACC,MAAAA,GAAAA;AAC9C,IAAA,MAAML,KAAAA,GAAQM,mCAAAA,EAAAA;AACd,IAAA,MAAM,CAAC,EAAEC,KAAK,EAAE,EAAEC,SAAS,GAAGC,0BAAAA,EAAAA;IAC9B,MAAMC,YAAAA,GAAeC,IAAAA,CAAKC,SAAS,CAACP,MAAAA,CAAAA;AACpC,IAAA,MAAM,CAACQ,UAAAA,EAAYC,aAAAA,CAAc,GAAGC,cAAAA,CAAS,KAAA,CAAA;;IAG7CC,eAAAA,CAAU,IAAA;AACR,QAAA,MAAMC,sBAA+C,EAAC;QAEtD,KAAK,MAAM,CAACC,SAAAA,EAAWnB,KAAAA,CAAM,IAAIoB,MAAAA,CAAOC,OAAO,CAACf,MAAAA,CAAAA,CAAS;YACvD,MAAM,EAAEP,GAAG,EAAEG,KAAK,EAAE,GAAGJ,oBAAAA,CAAqBqB,WAAWnB,KAAAA,EAAOC,KAAAA,CAAAA;AAE9D,YAAA,MAAMqB,gBAAAA,GAAmBC,MAAAA,CAAOC,YAAY,CAACC,OAAO,CAAC1B,GAAAA,CAAAA;AACrD,YAAA,IAAI,CAACuB,gBAAAA,EAAkB;YAEvB,IAAII,iBAAAA;YACJ,IAAI;gBACFA,iBAAAA,GAAoBd,IAAAA,CAAKe,KAAK,CAACL,gBAAAA,CAAAA;AACjC,YAAA,CAAA,CAAE,OAAM;AACN,gBAAA;AACF,YAAA;AACA,YAAA,IAAIF,OAAO7B,IAAI,CAACmC,iBAAAA,CAAAA,CAAmBE,MAAM,KAAK,CAAA,EAAG;YAEjD,MAAMC,aAAAA,GAAgBxC,iBAAiBqC,iBAAAA,EAAmBxB,KAAAA,CAAAA;YAC1DkB,MAAAA,CAAOU,MAAM,CAACZ,mBAAAA,EAAqBW,aAAAA,CAAAA;AACrC,QAAA;AAEA,QAAA,IAAIT,OAAO7B,IAAI,CAAC2B,mBAAAA,CAAAA,CAAqBU,MAAM,GAAG,CAAA,EAAG;YAC/CnB,QAAAA,CAAS;AAAE,gBAAA,GAAGS,mBAAmB;AAAE,gBAAA,GAAGV;AAAM,aAAA,EAAG,MAAA,EAAQ,IAAA,CAAA;AACzD,QAAA;QACAO,aAAAA,CAAc,IAAA,CAAA;;IAEhB,CAAA,EAAG;AAACJ,QAAAA,YAAAA;AAAcV,QAAAA;AAAM,KAAA,CAAA;;IAGxBgB,eAAAA,CAAU,IAAA;QACR,KAAK,MAAM,CAACE,SAAAA,EAAWnB,KAAAA,CAAM,IAAIoB,MAAAA,CAAOC,OAAO,CAACf,MAAAA,CAAAA,CAAS;YACvD,MAAM,EAAEP,GAAG,EAAEG,KAAK,EAAE,GAAGJ,oBAAAA,CAAqBqB,WAAWnB,KAAAA,EAAOC,KAAAA,CAAAA;YAE9D,MAAM8B,eAAAA,GAAkB1C,iBAAiBmB,KAAAA,EAAON,KAAAA,CAAAA;AAChD,YAAA,IAAIkB,OAAO7B,IAAI,CAACwC,eAAAA,CAAAA,CAAiBH,MAAM,KAAK,CAAA,EAAG;gBAC7CL,MAAAA,CAAOC,YAAY,CAACQ,UAAU,CAACjC,GAAAA,CAAAA;AAC/B,gBAAA;AACF,YAAA;AAEAwB,YAAAA,MAAAA,CAAOC,YAAY,CAACS,OAAO,CAAClC,GAAAA,EAAKa,IAAAA,CAAKC,SAAS,CAACkB,eAAAA,CAAAA,CAAAA;AAClD,QAAA;;IAEF,CAAA,EAAG;AAACvB,QAAAA,KAAAA;AAAOG,QAAAA,YAAAA;AAAcV,QAAAA;AAAM,KAAA,CAAA;IAE/B,OAAO;AAAEa,QAAAA;AAAW,KAAA;AACtB;;;;"}
@@ -60,7 +60,10 @@ const usePersistentPartialQueryParams = (config)=>{
60
60
  for (const [keyPrefix, entry] of Object.entries(config)){
61
61
  const { key, paths } = normalizeConfigEntry(keyPrefix, entry, scope);
62
62
  const paramsToPersist = filterObjectKeys(query, paths);
63
- if (Object.keys(paramsToPersist).length === 0) continue;
63
+ if (Object.keys(paramsToPersist).length === 0) {
64
+ window.localStorage.removeItem(key);
65
+ continue;
66
+ }
64
67
  window.localStorage.setItem(key, JSON.stringify(paramsToPersist));
65
68
  }
66
69
  // eslint-disable-next-line react-hooks/exhaustive-deps
@@ -1 +1 @@
1
- {"version":3,"file":"usePersistentQueryParams.mjs","sources":["../../../admin/src/hooks/usePersistentQueryParams.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport { usePersistentStateScope, useQueryParams } from '@strapi/admin/strapi-admin';\nimport get from 'lodash/get';\nimport set from 'lodash/set';\n\ntype PropertyPath = Parameters<typeof get>[1];\n\ninterface PersistentQueryConfigEntry {\n paths: PropertyPath[];\n scoped?: boolean;\n}\n\nconst filterObjectKeys = (obj: object, keys: PropertyPath[]) => {\n const result: Record<string, unknown> = {};\n\n for (const path of keys) {\n const value = get(obj, path);\n\n if (value !== undefined) {\n set(result, path, value);\n }\n }\n\n return result;\n};\n\nexport type PersistentQueryConfig = Record<string, PersistentQueryConfigEntry>;\n\nconst normalizeConfigEntry = (\n key: string,\n entry: PersistentQueryConfigEntry,\n scope: string | false | undefined\n) => {\n const { paths } = entry;\n const isScoped = entry.scoped === true && !!scope;\n\n return {\n key: isScoped ? `${key}:${scope}` : key,\n paths,\n };\n};\n\nexport const usePersistentPartialQueryParams = (config: PersistentQueryConfig) => {\n const scope = usePersistentStateScope();\n const [{ query }, setQuery] = useQueryParams();\n const clonedConfig = JSON.stringify(config);\n const [isHydrated, setIsHydrated] = useState(false);\n\n // load query params from local storge\n useEffect(() => {\n const mergedFilteredQuery: Record<string, unknown> = {};\n\n for (const [keyPrefix, entry] of Object.entries(config)) {\n const { key, paths } = normalizeConfigEntry(keyPrefix, entry, scope);\n\n const savedQueryParams = window.localStorage.getItem(key);\n if (!savedQueryParams) continue;\n\n let parsedSavedParams: Record<string, unknown>;\n try {\n parsedSavedParams = JSON.parse(savedQueryParams);\n } catch {\n continue;\n }\n if (Object.keys(parsedSavedParams).length === 0) continue;\n\n const filteredQuery = filterObjectKeys(parsedSavedParams, paths);\n Object.assign(mergedFilteredQuery, filteredQuery);\n }\n\n if (Object.keys(mergedFilteredQuery).length > 0) {\n setQuery({ ...mergedFilteredQuery, ...query }, 'push', true);\n }\n setIsHydrated(true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [clonedConfig, scope]);\n\n // update local storage\n useEffect(() => {\n for (const [keyPrefix, entry] of Object.entries(config)) {\n const { key, paths } = normalizeConfigEntry(keyPrefix, entry, scope);\n\n const paramsToPersist = filterObjectKeys(query, paths);\n if (Object.keys(paramsToPersist).length === 0) continue;\n window.localStorage.setItem(key, JSON.stringify(paramsToPersist));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [query, clonedConfig, scope]);\n\n return { isHydrated };\n};\n"],"names":["filterObjectKeys","obj","keys","result","path","value","get","undefined","set","normalizeConfigEntry","key","entry","scope","paths","isScoped","scoped","usePersistentPartialQueryParams","config","usePersistentStateScope","query","setQuery","useQueryParams","clonedConfig","JSON","stringify","isHydrated","setIsHydrated","useState","useEffect","mergedFilteredQuery","keyPrefix","Object","entries","savedQueryParams","window","localStorage","getItem","parsedSavedParams","parse","length","filteredQuery","assign","paramsToPersist","setItem"],"mappings":"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"}
1
+ {"version":3,"file":"usePersistentQueryParams.mjs","sources":["../../../admin/src/hooks/usePersistentQueryParams.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport { usePersistentStateScope, useQueryParams } from '@strapi/admin/strapi-admin';\nimport get from 'lodash/get';\nimport set from 'lodash/set';\n\ntype PropertyPath = Parameters<typeof get>[1];\n\ninterface PersistentQueryConfigEntry {\n paths: PropertyPath[];\n scoped?: boolean;\n}\n\nconst filterObjectKeys = (obj: object, keys: PropertyPath[]) => {\n const result: Record<string, unknown> = {};\n\n for (const path of keys) {\n const value = get(obj, path);\n\n if (value !== undefined) {\n set(result, path, value);\n }\n }\n\n return result;\n};\n\nexport type PersistentQueryConfig = Record<string, PersistentQueryConfigEntry>;\n\nconst normalizeConfigEntry = (\n key: string,\n entry: PersistentQueryConfigEntry,\n scope: string | false | undefined\n) => {\n const { paths } = entry;\n const isScoped = entry.scoped === true && !!scope;\n\n return {\n key: isScoped ? `${key}:${scope}` : key,\n paths,\n };\n};\n\nexport const usePersistentPartialQueryParams = (config: PersistentQueryConfig) => {\n const scope = usePersistentStateScope();\n const [{ query }, setQuery] = useQueryParams();\n const clonedConfig = JSON.stringify(config);\n const [isHydrated, setIsHydrated] = useState(false);\n\n // load query params from local storge\n useEffect(() => {\n const mergedFilteredQuery: Record<string, unknown> = {};\n\n for (const [keyPrefix, entry] of Object.entries(config)) {\n const { key, paths } = normalizeConfigEntry(keyPrefix, entry, scope);\n\n const savedQueryParams = window.localStorage.getItem(key);\n if (!savedQueryParams) continue;\n\n let parsedSavedParams: Record<string, unknown>;\n try {\n parsedSavedParams = JSON.parse(savedQueryParams);\n } catch {\n continue;\n }\n if (Object.keys(parsedSavedParams).length === 0) continue;\n\n const filteredQuery = filterObjectKeys(parsedSavedParams, paths);\n Object.assign(mergedFilteredQuery, filteredQuery);\n }\n\n if (Object.keys(mergedFilteredQuery).length > 0) {\n setQuery({ ...mergedFilteredQuery, ...query }, 'push', true);\n }\n setIsHydrated(true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [clonedConfig, scope]);\n\n // update local storage\n useEffect(() => {\n for (const [keyPrefix, entry] of Object.entries(config)) {\n const { key, paths } = normalizeConfigEntry(keyPrefix, entry, scope);\n\n const paramsToPersist = filterObjectKeys(query, paths);\n if (Object.keys(paramsToPersist).length === 0) {\n window.localStorage.removeItem(key);\n continue;\n }\n\n window.localStorage.setItem(key, JSON.stringify(paramsToPersist));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [query, clonedConfig, scope]);\n\n return { isHydrated };\n};\n"],"names":["filterObjectKeys","obj","keys","result","path","value","get","undefined","set","normalizeConfigEntry","key","entry","scope","paths","isScoped","scoped","usePersistentPartialQueryParams","config","usePersistentStateScope","query","setQuery","useQueryParams","clonedConfig","JSON","stringify","isHydrated","setIsHydrated","useState","useEffect","mergedFilteredQuery","keyPrefix","Object","entries","savedQueryParams","window","localStorage","getItem","parsedSavedParams","parse","length","filteredQuery","assign","paramsToPersist","removeItem","setItem"],"mappings":"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"}
@@ -4,7 +4,7 @@ var jsxRuntime = require('react/jsx-runtime');
4
4
  var React = require('react');
5
5
  var designSystem = require('@strapi/design-system');
6
6
  var Icons = require('@strapi/icons');
7
- var Prism = require('prismjs');
7
+ var PrismModule = require('prismjs');
8
8
  var reactIntl = require('react-intl');
9
9
  var slate = require('slate');
10
10
  var slateReact = require('slate-react');
@@ -82,19 +82,36 @@ function _interopNamespaceDefault(e) {
82
82
  }
83
83
 
84
84
  var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
85
- var Prism__namespace = /*#__PURE__*/_interopNamespaceDefault(Prism);
85
+ var PrismModule__namespace = /*#__PURE__*/_interopNamespaceDefault(PrismModule);
86
86
 
87
+ /**
88
+ * prismjs is UMD and may not expose a namespace when bundled by Vite; the content-manager
89
+ * index preloads it so `window.Prism` is set. Use that when the module import is empty.
90
+ */ function resolvePrism() {
91
+ if (typeof PrismModule__namespace !== 'undefined' && PrismModule__namespace?.languages) {
92
+ return PrismModule__namespace;
93
+ }
94
+ if (typeof window === 'undefined') {
95
+ return undefined;
96
+ }
97
+ const globalPrism = window.Prism;
98
+ return globalPrism;
99
+ }
100
+ const Prism = resolvePrism();
87
101
  const decorateCode = ([node, path])=>{
88
102
  const ranges = [];
103
+ // Prism can be undefined when the UMD bundle doesn't expose a namespace and window.Prism
104
+ // isn't set yet (e.g. this chunk ran before the content-manager preload). Skip decoration.
105
+ if (!Prism?.languages) return ranges;
89
106
  // make sure it is an Slate Element
90
107
  if (!slate.Element.isElement(node) || node.type !== 'code') return ranges;
91
108
  // transform the Element into a string
92
109
  const text = slate.Node.string(node);
93
110
  const language = constants.codeLanguages.find((lang)=>lang.value === node.language);
94
111
  const decorateKey = language?.decorate ?? language?.value;
95
- const selectedLanguage = Prism__namespace.languages[decorateKey || 'plaintext'];
112
+ const selectedLanguage = Prism.languages[decorateKey || 'plaintext'];
96
113
  // create "tokens" with "prismjs" and put them in "ranges"
97
- const tokens = Prism__namespace.tokenize(text, selectedLanguage);
114
+ const tokens = Prism.tokenize(text, selectedLanguage);
98
115
  let start = 0;
99
116
  for (const token of tokens){
100
117
  const length = token.length;
@@ -1 +1 @@
1
- {"version":3,"file":"Code.js","sources":["../../../../../../../../admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, SingleSelect, SingleSelectOption } from '@strapi/design-system';\nimport { CodeBlock as CodeBlockIcon } from '@strapi/icons';\nimport * as Prism from 'prismjs';\nimport { useIntl } from 'react-intl';\nimport { BaseRange, Element, Editor, Node, NodeEntry, Transforms } from 'slate';\nimport { useSelected, type RenderElementProps, useFocused, ReactEditor } from 'slate-react';\nimport { styled } from 'styled-components';\n\nimport { useBlocksEditorContext, type BlocksStore } from '../BlocksEditor';\nimport { codeLanguages } from '../utils/constants';\nimport { baseHandleConvert } from '../utils/conversions';\nimport { pressEnterTwiceToExit } from '../utils/enterKey';\nimport { type Block } from '../utils/types';\n\nimport 'prismjs/themes/prism-solarizedlight.css';\nimport 'prismjs/components/prism-asmatmel';\nimport 'prismjs/components/prism-bash';\nimport 'prismjs/components/prism-basic';\nimport 'prismjs/components/prism-c';\nimport 'prismjs/components/prism-clojure';\nimport 'prismjs/components/prism-cobol';\nimport 'prismjs/components/prism-cpp';\nimport 'prismjs/components/prism-csharp';\nimport 'prismjs/components/prism-dart';\nimport 'prismjs/components/prism-docker';\nimport 'prismjs/components/prism-elixir';\nimport 'prismjs/components/prism-erlang';\nimport 'prismjs/components/prism-fortran';\nimport 'prismjs/components/prism-fsharp';\nimport 'prismjs/components/prism-go';\nimport 'prismjs/components/prism-graphql';\nimport 'prismjs/components/prism-groovy';\nimport 'prismjs/components/prism-haskell';\nimport 'prismjs/components/prism-haxe';\nimport 'prismjs/components/prism-ini';\nimport 'prismjs/components/prism-java';\nimport 'prismjs/components/prism-javascript';\nimport 'prismjs/components/prism-jsx';\nimport 'prismjs/components/prism-json';\nimport 'prismjs/components/prism-julia';\nimport 'prismjs/components/prism-kotlin';\nimport 'prismjs/components/prism-latex';\nimport 'prismjs/components/prism-lua';\nimport 'prismjs/components/prism-markdown';\nimport 'prismjs/components/prism-matlab';\nimport 'prismjs/components/prism-makefile';\nimport 'prismjs/components/prism-objectivec';\nimport 'prismjs/components/prism-perl';\nimport 'prismjs/components/prism-php';\nimport 'prismjs/components/prism-powershell';\nimport 'prismjs/components/prism-python';\nimport 'prismjs/components/prism-r';\nimport 'prismjs/components/prism-ruby';\nimport 'prismjs/components/prism-rust';\nimport 'prismjs/components/prism-sas';\nimport 'prismjs/components/prism-scala';\nimport 'prismjs/components/prism-scheme';\nimport 'prismjs/components/prism-sql';\nimport 'prismjs/components/prism-stata';\nimport 'prismjs/components/prism-swift';\nimport 'prismjs/components/prism-typescript';\nimport 'prismjs/components/prism-tsx';\nimport 'prismjs/components/prism-vbnet';\nimport 'prismjs/components/prism-yaml';\n\ntype BaseRangeCustom = BaseRange & { className: string };\n\nexport const decorateCode = ([node, path]: NodeEntry) => {\n const ranges: BaseRangeCustom[] = [];\n\n // make sure it is an Slate Element\n if (!Element.isElement(node) || node.type !== 'code') return ranges;\n // transform the Element into a string\n const text = Node.string(node);\n const language = codeLanguages.find((lang) => lang.value === node.language);\n const decorateKey = language?.decorate ?? language?.value;\n\n const selectedLanguage = Prism.languages[decorateKey || 'plaintext'];\n\n // create \"tokens\" with \"prismjs\" and put them in \"ranges\"\n const tokens = Prism.tokenize(text, selectedLanguage);\n let start = 0;\n for (const token of tokens) {\n const length = token.length;\n const end = start + length;\n if (typeof token !== 'string') {\n ranges.push({\n anchor: { path, offset: start },\n focus: { path, offset: end },\n className: `token ${token.type}`,\n });\n }\n start = end;\n }\n\n // these will be found in \"renderLeaf\" in \"leaf\" and their \"className\" will be applied\n return ranges;\n};\n\nconst CodeBlock = styled.pre`\n border-radius: ${({ theme }) => theme.borderRadius};\n background-color: ${({ theme }) => theme.colors.neutral100};\n max-width: 100%;\n overflow: auto;\n padding: ${({ theme }) => `${theme.spaces[3]} ${theme.spaces[4]}`};\n flex-shrink: 1;\n\n & > code {\n font-family: 'SF Mono', SFMono-Regular, ui-monospace, 'DejaVu Sans Mono', Menlo, Consolas,\n monospace;\n color: ${({ theme }) => theme.colors.neutral800};\n overflow: auto;\n max-width: 100%;\n }\n`;\n\nconst CodeEditor = (props: RenderElementProps) => {\n const { editor } = useBlocksEditorContext('ImageDialog');\n const editorIsFocused = useFocused();\n const imageIsSelected = useSelected();\n const { formatMessage } = useIntl();\n const [isSelectOpen, setIsSelectOpen] = React.useState(false);\n const shouldDisplayLanguageSelect = (editorIsFocused && imageIsSelected) || isSelectOpen;\n\n return (\n <Box position=\"relative\" width=\"100%\">\n <CodeBlock {...props.attributes}>\n <code>{props.children}</code>\n </CodeBlock>\n {shouldDisplayLanguageSelect && (\n <Box\n position=\"absolute\"\n background=\"neutral0\"\n borderColor=\"neutral150\"\n borderStyle=\"solid\"\n borderWidth=\"0.5px\"\n shadow=\"tableShadow\"\n top=\"100%\"\n marginTop={1}\n right={0}\n padding={1}\n hasRadius\n >\n <SingleSelect\n onChange={(open) => {\n Transforms.setNodes(\n editor,\n { language: open.toString() },\n { match: (node) => !Editor.isEditor(node) && node.type === 'code' }\n );\n }}\n value={(props.element.type === 'code' && props.element.language) || 'plaintext'}\n onOpenChange={(open) => {\n setIsSelectOpen(open);\n\n // Focus the editor again when closing the select so the user can continue typing\n if (!open) {\n ReactEditor.focus(editor);\n }\n }}\n onCloseAutoFocus={(e) => e.preventDefault()}\n aria-label={formatMessage({\n id: 'components.Blocks.blocks.code.languageLabel',\n defaultMessage: 'Select a language',\n })}\n >\n {codeLanguages.map(({ value, label }) => (\n <SingleSelectOption value={value} key={value}>\n {label}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Box>\n )}\n </Box>\n );\n};\n\nconst withCode = (editor: Editor) => {\n const { insertData } = editor;\n\n editor.insertData = (data) => {\n const pastedText = data.getData('text/plain');\n\n if (pastedText && editor.selection) {\n // Check if we're currently inside a code block\n const codeBlockEntry = Editor.above(editor, {\n match: (node) => !Editor.isEditor(node) && node.type === 'code',\n });\n\n if (codeBlockEntry) {\n // We're inside a code block, handle the paste specially\n // Replace the selected content with the pasted text, preserving newlines\n Transforms.insertText(editor, pastedText);\n return;\n }\n }\n\n // For non-code blocks, use the default behavior\n insertData(data);\n };\n\n return editor;\n};\n\nconst codeBlocks: Pick<BlocksStore, 'code'> = {\n code: {\n renderElement: (props) => <CodeEditor {...props} />,\n icon: CodeBlockIcon,\n label: {\n id: 'components.Blocks.blocks.code',\n defaultMessage: 'Code block',\n },\n matchNode: (node) => node.type === 'code',\n isInBlocksSelector: true,\n handleConvert(editor) {\n baseHandleConvert<Block<'code'>>(editor, { type: 'code', language: 'plaintext' });\n },\n handleEnterKey(editor) {\n pressEnterTwiceToExit(editor);\n },\n snippets: ['```'],\n plugin: withCode,\n },\n};\n\nexport { codeBlocks };\n"],"names":["decorateCode","node","path","ranges","Element","isElement","type","text","Node","string","language","codeLanguages","find","lang","value","decorateKey","decorate","selectedLanguage","Prism","languages","tokens","tokenize","start","token","length","end","push","anchor","offset","focus","className","CodeBlock","styled","pre","theme","borderRadius","colors","neutral100","spaces","neutral800","CodeEditor","props","editor","useBlocksEditorContext","editorIsFocused","useFocused","imageIsSelected","useSelected","formatMessage","useIntl","isSelectOpen","setIsSelectOpen","React","useState","shouldDisplayLanguageSelect","_jsxs","Box","position","width","_jsx","attributes","code","children","background","borderColor","borderStyle","borderWidth","shadow","top","marginTop","right","padding","hasRadius","SingleSelect","onChange","open","Transforms","setNodes","toString","match","Editor","isEditor","element","onOpenChange","ReactEditor","onCloseAutoFocus","e","preventDefault","aria-label","id","defaultMessage","map","label","SingleSelectOption","withCode","insertData","data","pastedText","getData","selection","codeBlockEntry","above","insertText","codeBlocks","renderElement","icon","CodeBlockIcon","matchNode","isInBlocksSelector","handleConvert","baseHandleConvert","handleEnterKey","pressEnterTwiceToExit","snippets","plugin"],"mappings":"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"}
1
+ {"version":3,"file":"Code.js","sources":["../../../../../../../../admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, SingleSelect, SingleSelectOption } from '@strapi/design-system';\nimport { CodeBlock as CodeBlockIcon } from '@strapi/icons';\nimport * as PrismModule from 'prismjs';\nimport { useIntl } from 'react-intl';\nimport { BaseRange, Element, Editor, Node, NodeEntry, Transforms } from 'slate';\nimport { useSelected, type RenderElementProps, useFocused, ReactEditor } from 'slate-react';\nimport { styled } from 'styled-components';\n\nimport { useBlocksEditorContext, type BlocksStore } from '../BlocksEditor';\nimport { codeLanguages } from '../utils/constants';\nimport { baseHandleConvert } from '../utils/conversions';\nimport { pressEnterTwiceToExit } from '../utils/enterKey';\nimport { type Block } from '../utils/types';\n\nimport 'prismjs/themes/prism-solarizedlight.css';\nimport 'prismjs/components/prism-asmatmel';\nimport 'prismjs/components/prism-bash';\nimport 'prismjs/components/prism-basic';\nimport 'prismjs/components/prism-c';\nimport 'prismjs/components/prism-clojure';\nimport 'prismjs/components/prism-cobol';\nimport 'prismjs/components/prism-cpp';\nimport 'prismjs/components/prism-csharp';\nimport 'prismjs/components/prism-dart';\nimport 'prismjs/components/prism-docker';\nimport 'prismjs/components/prism-elixir';\nimport 'prismjs/components/prism-erlang';\nimport 'prismjs/components/prism-fortran';\nimport 'prismjs/components/prism-fsharp';\nimport 'prismjs/components/prism-go';\nimport 'prismjs/components/prism-graphql';\nimport 'prismjs/components/prism-groovy';\nimport 'prismjs/components/prism-haskell';\nimport 'prismjs/components/prism-haxe';\nimport 'prismjs/components/prism-ini';\nimport 'prismjs/components/prism-java';\nimport 'prismjs/components/prism-javascript';\nimport 'prismjs/components/prism-jsx';\nimport 'prismjs/components/prism-json';\nimport 'prismjs/components/prism-julia';\nimport 'prismjs/components/prism-kotlin';\nimport 'prismjs/components/prism-latex';\nimport 'prismjs/components/prism-lua';\nimport 'prismjs/components/prism-markdown';\nimport 'prismjs/components/prism-matlab';\nimport 'prismjs/components/prism-makefile';\nimport 'prismjs/components/prism-objectivec';\nimport 'prismjs/components/prism-perl';\nimport 'prismjs/components/prism-php';\nimport 'prismjs/components/prism-powershell';\nimport 'prismjs/components/prism-python';\nimport 'prismjs/components/prism-r';\nimport 'prismjs/components/prism-ruby';\nimport 'prismjs/components/prism-rust';\nimport 'prismjs/components/prism-sas';\nimport 'prismjs/components/prism-scala';\nimport 'prismjs/components/prism-scheme';\nimport 'prismjs/components/prism-sql';\nimport 'prismjs/components/prism-stata';\nimport 'prismjs/components/prism-swift';\nimport 'prismjs/components/prism-typescript';\nimport 'prismjs/components/prism-tsx';\nimport 'prismjs/components/prism-vbnet';\nimport 'prismjs/components/prism-yaml';\n\n/**\n * prismjs is UMD and may not expose a namespace when bundled by Vite; the content-manager\n * index preloads it so `window.Prism` is set. Use that when the module import is empty.\n */\nfunction resolvePrism(): typeof PrismModule | undefined {\n if (typeof PrismModule !== 'undefined' && PrismModule?.languages) {\n return PrismModule;\n }\n\n if (typeof window === 'undefined') {\n return undefined;\n }\n\n const globalPrism = (window as Window & { Prism?: typeof PrismModule }).Prism;\n return globalPrism;\n}\n\nconst Prism = resolvePrism();\n\ntype BaseRangeCustom = BaseRange & { className: string };\n\nexport const decorateCode = ([node, path]: NodeEntry) => {\n const ranges: BaseRangeCustom[] = [];\n\n // Prism can be undefined when the UMD bundle doesn't expose a namespace and window.Prism\n // isn't set yet (e.g. this chunk ran before the content-manager preload). Skip decoration.\n if (!Prism?.languages) return ranges;\n\n // make sure it is an Slate Element\n if (!Element.isElement(node) || node.type !== 'code') return ranges;\n // transform the Element into a string\n const text = Node.string(node);\n const language = codeLanguages.find((lang) => lang.value === node.language);\n const decorateKey = language?.decorate ?? language?.value;\n\n const selectedLanguage = Prism.languages[decorateKey || 'plaintext'];\n\n // create \"tokens\" with \"prismjs\" and put them in \"ranges\"\n const tokens = Prism.tokenize(text, selectedLanguage);\n let start = 0;\n for (const token of tokens) {\n const length = token.length;\n const end = start + length;\n if (typeof token !== 'string') {\n ranges.push({\n anchor: { path, offset: start },\n focus: { path, offset: end },\n className: `token ${token.type}`,\n });\n }\n start = end;\n }\n\n // these will be found in \"renderLeaf\" in \"leaf\" and their \"className\" will be applied\n return ranges;\n};\n\nconst CodeBlock = styled.pre`\n border-radius: ${({ theme }) => theme.borderRadius};\n background-color: ${({ theme }) => theme.colors.neutral100};\n max-width: 100%;\n overflow: auto;\n padding: ${({ theme }) => `${theme.spaces[3]} ${theme.spaces[4]}`};\n flex-shrink: 1;\n\n & > code {\n font-family: 'SF Mono', SFMono-Regular, ui-monospace, 'DejaVu Sans Mono', Menlo, Consolas,\n monospace;\n color: ${({ theme }) => theme.colors.neutral800};\n overflow: auto;\n max-width: 100%;\n }\n`;\n\nconst CodeEditor = (props: RenderElementProps) => {\n const { editor } = useBlocksEditorContext('ImageDialog');\n const editorIsFocused = useFocused();\n const imageIsSelected = useSelected();\n const { formatMessage } = useIntl();\n const [isSelectOpen, setIsSelectOpen] = React.useState(false);\n const shouldDisplayLanguageSelect = (editorIsFocused && imageIsSelected) || isSelectOpen;\n\n return (\n <Box position=\"relative\" width=\"100%\">\n <CodeBlock {...props.attributes}>\n <code>{props.children}</code>\n </CodeBlock>\n {shouldDisplayLanguageSelect && (\n <Box\n position=\"absolute\"\n background=\"neutral0\"\n borderColor=\"neutral150\"\n borderStyle=\"solid\"\n borderWidth=\"0.5px\"\n shadow=\"tableShadow\"\n top=\"100%\"\n marginTop={1}\n right={0}\n padding={1}\n hasRadius\n >\n <SingleSelect\n onChange={(open) => {\n Transforms.setNodes(\n editor,\n { language: open.toString() },\n { match: (node) => !Editor.isEditor(node) && node.type === 'code' }\n );\n }}\n value={(props.element.type === 'code' && props.element.language) || 'plaintext'}\n onOpenChange={(open) => {\n setIsSelectOpen(open);\n\n // Focus the editor again when closing the select so the user can continue typing\n if (!open) {\n ReactEditor.focus(editor);\n }\n }}\n onCloseAutoFocus={(e) => e.preventDefault()}\n aria-label={formatMessage({\n id: 'components.Blocks.blocks.code.languageLabel',\n defaultMessage: 'Select a language',\n })}\n >\n {codeLanguages.map(({ value, label }) => (\n <SingleSelectOption value={value} key={value}>\n {label}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Box>\n )}\n </Box>\n );\n};\n\nconst withCode = (editor: Editor) => {\n const { insertData } = editor;\n\n editor.insertData = (data) => {\n const pastedText = data.getData('text/plain');\n\n if (pastedText && editor.selection) {\n // Check if we're currently inside a code block\n const codeBlockEntry = Editor.above(editor, {\n match: (node) => !Editor.isEditor(node) && node.type === 'code',\n });\n\n if (codeBlockEntry) {\n // We're inside a code block, handle the paste specially\n // Replace the selected content with the pasted text, preserving newlines\n Transforms.insertText(editor, pastedText);\n return;\n }\n }\n\n // For non-code blocks, use the default behavior\n insertData(data);\n };\n\n return editor;\n};\n\nconst codeBlocks: Pick<BlocksStore, 'code'> = {\n code: {\n renderElement: (props) => <CodeEditor {...props} />,\n icon: CodeBlockIcon,\n label: {\n id: 'components.Blocks.blocks.code',\n defaultMessage: 'Code block',\n },\n matchNode: (node) => node.type === 'code',\n isInBlocksSelector: true,\n handleConvert(editor) {\n baseHandleConvert<Block<'code'>>(editor, { type: 'code', language: 'plaintext' });\n },\n handleEnterKey(editor) {\n pressEnterTwiceToExit(editor);\n },\n snippets: ['```'],\n plugin: withCode,\n },\n};\n\nexport { codeBlocks };\n"],"names":["resolvePrism","PrismModule","languages","window","undefined","globalPrism","Prism","decorateCode","node","path","ranges","Element","isElement","type","text","Node","string","language","codeLanguages","find","lang","value","decorateKey","decorate","selectedLanguage","tokens","tokenize","start","token","length","end","push","anchor","offset","focus","className","CodeBlock","styled","pre","theme","borderRadius","colors","neutral100","spaces","neutral800","CodeEditor","props","editor","useBlocksEditorContext","editorIsFocused","useFocused","imageIsSelected","useSelected","formatMessage","useIntl","isSelectOpen","setIsSelectOpen","React","useState","shouldDisplayLanguageSelect","_jsxs","Box","position","width","_jsx","attributes","code","children","background","borderColor","borderStyle","borderWidth","shadow","top","marginTop","right","padding","hasRadius","SingleSelect","onChange","open","Transforms","setNodes","toString","match","Editor","isEditor","element","onOpenChange","ReactEditor","onCloseAutoFocus","e","preventDefault","aria-label","id","defaultMessage","map","label","SingleSelectOption","withCode","insertData","data","pastedText","getData","selection","codeBlockEntry","above","insertText","codeBlocks","renderElement","icon","CodeBlockIcon","matchNode","isInBlocksSelector","handleConvert","baseHandleConvert","handleEnterKey","pressEnterTwiceToExit","snippets","plugin"],"mappings":"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"}
@@ -2,9 +2,9 @@ import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
3
  import { Box, SingleSelect, SingleSelectOption } from '@strapi/design-system';
4
4
  import { CodeBlock as CodeBlock$1 } from '@strapi/icons';
5
- import * as Prism from 'prismjs';
5
+ import * as PrismModule from 'prismjs';
6
6
  import { useIntl } from 'react-intl';
7
- import { Editor, Transforms, Element, Node } from 'slate';
7
+ import { Element, Node, Editor, Transforms } from 'slate';
8
8
  import { useFocused, useSelected, ReactEditor } from 'slate-react';
9
9
  import { styled } from 'styled-components';
10
10
  import { useBlocksEditorContext } from '../BlocksEditor.mjs';
@@ -62,8 +62,25 @@ import 'prismjs/components/prism-tsx';
62
62
  import 'prismjs/components/prism-vbnet';
63
63
  import 'prismjs/components/prism-yaml';
64
64
 
65
+ /**
66
+ * prismjs is UMD and may not expose a namespace when bundled by Vite; the content-manager
67
+ * index preloads it so `window.Prism` is set. Use that when the module import is empty.
68
+ */ function resolvePrism() {
69
+ if (typeof PrismModule !== 'undefined' && PrismModule?.languages) {
70
+ return PrismModule;
71
+ }
72
+ if (typeof window === 'undefined') {
73
+ return undefined;
74
+ }
75
+ const globalPrism = window.Prism;
76
+ return globalPrism;
77
+ }
78
+ const Prism = resolvePrism();
65
79
  const decorateCode = ([node, path])=>{
66
80
  const ranges = [];
81
+ // Prism can be undefined when the UMD bundle doesn't expose a namespace and window.Prism
82
+ // isn't set yet (e.g. this chunk ran before the content-manager preload). Skip decoration.
83
+ if (!Prism?.languages) return ranges;
67
84
  // make sure it is an Slate Element
68
85
  if (!Element.isElement(node) || node.type !== 'code') return ranges;
69
86
  // transform the Element into a string