datocms-plugin-sdk
Version:
1,348 lines (1,347 loc) • 143 kB
text/typescript
import type { Manifest } from './manifestTypes';
export const manifest: Manifest = {
hooks: {
validateManualFieldExtensionParameters: {
name: 'validateManualFieldExtensionParameters',
comment: {
markdownText:
'This function will be called each time the configuration object changes. It\nmust return an object containing possible validation errors.',
tag: 'manualFieldExtensions',
},
nonCtxArguments: [
{
name: 'fieldExtensionId',
typeName: 'string',
},
{
name: 'parameters',
typeName: 'Record<string, unknown>',
},
],
returnType: 'Record<string, unknown> | Promise<Record<string, unknown>>',
location: {
filePath: 'src/hooks/validateManualFieldExtensionParameters.ts',
lineNumber: 10,
},
},
uploadsDropdownActions: {
name: 'uploadsDropdownActions',
comment: {
markdownText:
'This function lets you set up custom actions (or groups of actions) that\nshow up when the user:\n\n* selects multiple assets in the Media Area for batch operations, or\n* opens up a specific asset from the Media Area.\n\nThe `executeUploadsDropdownAction()` hook will be triggered once the user\nclicks on one of the defined actions.',
tag: 'dropdownActions',
},
nonCtxArguments: [],
ctxArgument: {
type: 'Ctx',
additionalProperties: [],
additionalMethods: [],
},
returnType: 'Array<DropdownAction | DropdownActionGroup>',
location: {
filePath: 'src/hooks/uploadsDropdownActions.ts',
lineNumber: 17,
},
},
uploadSidebars: {
name: 'uploadSidebars',
comment: {
markdownText:
'Use this function to declare new sidebar to be shown when the user opens\nup an asset in the Media Area.',
tag: 'sidebarPanels',
},
nonCtxArguments: [],
ctxArgument: {
type: 'Ctx',
additionalProperties: [],
additionalMethods: [],
},
returnType: 'UploadSidebar[]',
location: {
filePath: 'src/hooks/uploadSidebars.ts',
lineNumber: 17,
},
},
uploadSidebarPanels: {
name: 'uploadSidebarPanels',
comment: {
markdownText:
'Use this function to declare new sidebar panels to be shown when the user\nopens up an asset in the Media Area.',
tag: 'sidebarPanels',
},
nonCtxArguments: [],
ctxArgument: {
type: 'Ctx',
additionalProperties: [],
additionalMethods: [],
},
returnType: 'UploadSidebarPanel[]',
location: {
filePath: 'src/hooks/uploadSidebarPanels.ts',
lineNumber: 19,
},
},
settingsAreaSidebarItemGroups: {
name: 'settingsAreaSidebarItemGroups',
comment: {
markdownText:
'Use this function to declare new navigation sections in the Settings Area\nsidebar.',
tag: 'pages',
},
nonCtxArguments: [],
ctxArgument: {
type: 'Ctx',
additionalProperties: [],
additionalMethods: [],
},
returnType: 'SettingsAreaSidebarItemGroup[]',
location: {
filePath: 'src/hooks/settingsAreaSidebarItemGroups.ts',
lineNumber: 19,
},
},
schemaItemTypeDropdownActions: {
name: 'schemaItemTypeDropdownActions',
comment: {
markdownText:
'Use this function to define custom actions (or groups of actions) for a model/block model in the Schema section.\n\nThe `executeSchemaItemTypeDropdownAction()` hook will be triggered once the user\nclicks on one of the defined actions.',
tag: 'dropdownActions',
},
nonCtxArguments: [
{
name: 'itemType',
typeName: 'ItemType',
},
],
ctxArgument: {
type: 'Ctx',
additionalProperties: [],
additionalMethods: [],
},
returnType: 'Array<DropdownAction | DropdownActionGroup>',
location: {
filePath: 'src/hooks/schemaItemTypeDropdownActions.ts',
lineNumber: 16,
},
},
renderUploadSidebarPanel: {
name: 'renderUploadSidebarPanel',
comment: {
markdownText:
'This function will be called when the plugin needs to render a sidebar panel\n(see the `uploadSidebarPanels` hook).',
tag: 'sidebarPanels',
},
nonCtxArguments: [
{
name: 'sidebarPaneId',
typeName: 'string',
},
],
ctxArgument: {
type: 'SelfResizingPluginFrameCtx',
additionalProperties: [
{
items: {
sidebarPaneId: {
comment: {
markdownText:
'The ID of the sidebar panel that needs to be rendered.',
},
location: {
filePath: 'src/hooks/renderUploadSidebarPanel.ts',
lineNumber: 24,
},
type: 'string',
},
parameters: {
comment: {
markdownText:
'The arbitrary `parameters` of the panel declared in the\n`uploadSidebarPanels` function.',
},
location: {
filePath: 'src/hooks/renderUploadSidebarPanel.ts',
lineNumber: 30,
},
type: 'Record<string, unknown>',
},
upload: {
comment: {
markdownText: 'The active asset.',
},
location: {
filePath: 'src/hooks/renderUploadSidebarPanel.ts',
lineNumber: 33,
},
type: 'Upload',
},
},
},
],
additionalMethods: [],
},
returnType: 'void',
location: {
filePath: 'src/hooks/renderUploadSidebarPanel.ts',
lineNumber: 14,
},
},
renderUploadSidebar: {
name: 'renderUploadSidebar',
comment: {
markdownText:
'This function will be called when the plugin needs to render a sidebar (see\nthe `uploadSidebars` hook).',
tag: 'sidebarPanels',
},
nonCtxArguments: [
{
name: 'sidebarId',
typeName: 'string',
},
],
ctxArgument: {
type: 'ImposedSizePluginFrameCtx',
additionalProperties: [
{
items: {
sidebarId: {
comment: {
markdownText:
'The ID of the sidebar that needs to be rendered.',
},
location: {
filePath: 'src/hooks/renderUploadSidebar.ts',
lineNumber: 21,
},
type: 'string',
},
parameters: {
comment: {
markdownText:
'The arbitrary `parameters` of the declared in the `uploadSidebars`\nfunction.',
},
location: {
filePath: 'src/hooks/renderUploadSidebar.ts',
lineNumber: 27,
},
type: 'Record<string, unknown>',
},
upload: {
comment: {
markdownText: 'The active asset.',
},
location: {
filePath: 'src/hooks/renderUploadSidebar.ts',
lineNumber: 30,
},
type: 'Upload',
},
},
},
],
additionalMethods: [],
},
returnType: 'void',
location: {
filePath: 'src/hooks/renderUploadSidebar.ts',
lineNumber: 14,
},
},
renderPage: {
name: 'renderPage',
comment: {
markdownText:
'This function will be called when the plugin needs to render a specific\npage (see the `mainNavigationTabs`, `settingsAreaSidebarItemGroups` and\n`contentAreaSidebarItems` functions).',
tag: 'pages',
},
nonCtxArguments: [
{
name: 'pageId',
typeName: 'string',
},
],
ctxArgument: {
type: 'ImposedSizePluginFrameCtx',
additionalProperties: [
{
items: {
pageId: {
comment: {
markdownText: 'The ID of the page that needs to be rendered.',
},
location: {
filePath: 'src/hooks/renderPage.ts',
lineNumber: 19,
},
type: 'string',
},
location: {
comment: {
markdownText: 'Current page location.',
},
location: {
filePath: 'src/hooks/renderPage.ts',
lineNumber: 22,
},
type: '{\n pathname: string;\n search: string;\n hash: string;\n }',
},
},
},
],
additionalMethods: [],
},
returnType: 'void',
location: {
filePath: 'src/hooks/renderPage.ts',
lineNumber: 12,
},
},
renderModal: {
name: 'renderModal',
comment: {
markdownText:
'This function will be called when the plugin requested to open a modal (see\nthe `openModal` hook).',
tag: 'modals',
},
nonCtxArguments: [
{
name: 'modalId',
typeName: 'string',
},
],
ctxArgument: {
type: 'SelfResizingPluginFrameCtx',
additionalProperties: [
{
items: {
modalId: {
comment: {
markdownText:
'The ID of the modal that needs to be rendered.',
},
location: {
filePath: 'src/hooks/renderModal.ts',
lineNumber: 17,
},
type: 'string',
},
parameters: {
comment: {
markdownText:
'The arbitrary `parameters` of the modal declared in the `openModal`\nfunction.',
},
location: {
filePath: 'src/hooks/renderModal.ts',
lineNumber: 22,
},
type: 'Record<string, unknown>',
},
},
},
],
additionalMethods: [
{
items: {
resolve: {
comment: {
markdownText:
'A function to be called by the plugin to close the modal. The `openModal`\ncall will be resolved with the passed return value.',
example:
"const returnValue = prompt(\n 'Please specify the value to return to the caller:',\n 'success',\n);\n\nawait ctx.resolve(returnValue);",
},
location: {
filePath: 'src/hooks/renderModal.ts',
lineNumber: 40,
},
type: '(returnValue: unknown) => Promise<void>',
},
},
},
],
},
returnType: 'void',
location: {
filePath: 'src/hooks/renderModal.ts',
lineNumber: 11,
},
},
renderManualFieldExtensionConfigScreen: {
name: 'renderManualFieldExtensionConfigScreen',
nonCtxArguments: [
{
name: 'fieldExtensionId',
typeName: 'string',
},
],
ctxArgument: {
type: 'SelfResizingPluginFrameCtx',
additionalProperties: [
{
items: {
fieldExtensionId: {
comment: {
markdownText:
'The ID of the field extension for which we need to render the parameters\nform.',
},
location: {
filePath:
'src/hooks/renderManualFieldExtensionConfigScreen.ts',
lineNumber: 23,
},
type: 'string',
},
parameters: {
comment: {
markdownText:
'The current value of the parameters (you can change the value with the\n`setParameters` hook).',
},
location: {
filePath:
'src/hooks/renderManualFieldExtensionConfigScreen.ts',
lineNumber: 28,
},
type: 'Record<string, unknown>',
},
errors: {
comment: {
markdownText:
'The current validation errors for the parameters (you can set them\nimplementing the `validateManualFieldExtensionParameters` hook).',
},
location: {
filePath:
'src/hooks/renderManualFieldExtensionConfigScreen.ts',
lineNumber: 33,
},
type: 'Record<string, unknown>',
},
pendingField: {
comment: {
markdownText:
'The field entity that is being edited in the form.',
},
location: {
filePath:
'src/hooks/renderManualFieldExtensionConfigScreen.ts',
lineNumber: 36,
},
type: 'PendingField',
},
itemType: {
comment: {
markdownText: 'The model for the field being edited.',
},
location: {
filePath:
'src/hooks/renderManualFieldExtensionConfigScreen.ts',
lineNumber: 39,
},
type: 'ItemType',
},
},
},
],
additionalMethods: [
{
items: {
setParameters: {
comment: {
markdownText: 'Sets a new value for the parameters.',
example: "await ctx.setParameters({ color: '#ff0000' });",
},
location: {
filePath:
'src/hooks/renderManualFieldExtensionConfigScreen.ts',
lineNumber: 51,
},
type: '(params: Record<string, unknown>) => Promise<void>',
},
},
},
],
},
returnType: 'void',
location: {
filePath: 'src/hooks/renderManualFieldExtensionConfigScreen.ts',
lineNumber: 9,
},
},
renderItemFormSidebarPanel: {
name: 'renderItemFormSidebarPanel',
comment: {
markdownText:
'This function will be called when the plugin needs to render a sidebar panel\n(see the `itemFormSidebarPanels` hook).',
tag: 'sidebarPanels',
},
nonCtxArguments: [
{
name: 'sidebarPaneId',
typeName: 'string',
},
],
ctxArgument: {
type: 'SelfResizingPluginFrameCtx',
additionalProperties: [
{
name: 'ItemFormAdditionalProperties',
comment: {
markdownText:
"These information describe the current state of the form that's being shown\nto the end-user to edit a record.",
},
items: {
locale: {
comment: {
markdownText: 'The currently active locale for the record.',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 12,
},
type: 'string',
},
item: {
comment: {
markdownText:
'If an already persisted record is being edited, returns the full record\nentity.',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 17,
},
type: 'Item | null',
},
itemType: {
comment: {
markdownText: 'The model for the record being edited.',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 19,
},
type: 'ItemType',
},
formValues: {
comment: {
markdownText: 'The complete internal form state.',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 21,
},
type: 'Record<string, unknown>',
},
itemStatus: {
comment: {
markdownText:
'The current status of the record being edited.',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 23,
},
type: "'new' | 'draft' | 'updated' | 'published'",
},
isSubmitting: {
comment: {
markdownText:
'Whether the form is currently submitting itself or not.',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 25,
},
type: 'boolean',
},
isFormDirty: {
comment: {
markdownText:
'Whether the form has some non-persisted changes or not.',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 27,
},
type: 'boolean',
},
blocksAnalysis: {
comment: {
markdownText:
'Provides information on how many blocks are currently present in the form.',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 29,
},
type: 'BlocksAnalysis',
},
},
},
{
items: {
sidebarPaneId: {
comment: {
markdownText:
'The ID of the sidebar panel that needs to be rendered.',
},
location: {
filePath: 'src/hooks/renderItemFormSidebarPanel.ts',
lineNumber: 25,
},
type: 'string',
},
parameters: {
comment: {
markdownText:
'The arbitrary `parameters` of the panel declared in the\n`itemFormSidebarPanels` function.',
},
location: {
filePath: 'src/hooks/renderItemFormSidebarPanel.ts',
lineNumber: 31,
},
type: 'Record<string, unknown>',
},
},
},
],
additionalMethods: [
{
name: 'ItemFormAdditionalMethods',
comment: {
markdownText:
"These methods can be used to interact with the form that's being shown to the\nend-user to edit a record.",
},
items: {
toggleField: {
comment: {
markdownText:
'Hides/shows a specific field in the form. Please be aware that when a field\nis hidden, the field editor for that field will be removed from the DOM\nitself, including any associated plugins. When it is shown again, its\nplugins will be reinitialized.',
example:
"const fieldPath = prompt(\n 'Please insert the path of a field in the form',\n ctx.fieldPath,\n);\n\nawait ctx.toggleField(fieldPath, true);",
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 68,
},
type: '(path: string, show: boolean) => Promise<void>',
},
disableField: {
comment: {
markdownText:
'Disables/re-enables a specific field in the form.',
example:
"const fieldPath = prompt(\n 'Please insert the path of a field in the form',\n ctx.fieldPath,\n);\n\nawait ctx.disableField(fieldPath, true);",
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 83,
},
type: '(path: string, disable: boolean) => Promise<void>',
},
scrollToField: {
comment: {
markdownText:
'Smoothly navigates to a specific field in the form. If the field is\nlocalized it will switch language tab and then navigate to the chosen\nfield.',
example:
"const fieldPath = prompt(\n 'Please insert the path of a field in the form',\n ctx.fieldPath,\n);\n\nawait ctx.scrollToField(fieldPath);",
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 100,
},
type: '(path: string, locale?: string) => Promise<void>',
},
setFieldValue: {
comment: {
markdownText:
'Changes a specific path of the `formValues` object.',
example:
"const fieldPath = prompt(\n 'Please insert the path of a field in the form',\n ctx.fieldPath,\n);\n\nawait ctx.setFieldValue(fieldPath, 'new value');",
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 115,
},
type: '(path: string, value: unknown) => Promise<void>',
},
formValuesToItem: {
comment: {
markdownText:
'Takes the internal form state, and transforms it into an Item entity\ncompatible with DatoCMS API.\n\nWhen `skipUnchangedFields`, only the fields that changed value will be\nserialized.\n\nIf the required nested blocks are still not loaded, this method will return\n`undefined`.',
example: 'await ctx.formValuesToItem(ctx.formValues, false);',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 132,
},
type: "(\n formValues: Record<string, unknown>,\n skipUnchangedFields?: boolean,\n ) => Promise<Omit<Item, 'id' | 'meta'> | undefined>",
},
itemToFormValues: {
comment: {
markdownText:
'Takes an Item entity, and converts it into the internal form state.',
example: 'await ctx.itemToFormValues(ctx.item);',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 145,
},
type: "(\n item: Omit<Item, 'id' | 'meta'>,\n ) => Promise<Record<string, unknown>>",
},
saveCurrentItem: {
comment: {
markdownText: 'Triggers a submit form for current record.',
example: 'await ctx.saveCurrentItem();',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 157,
},
type: '(showToast?: boolean) => Promise<void>',
},
},
},
],
},
returnType: 'void',
location: {
filePath: 'src/hooks/renderItemFormSidebarPanel.ts',
lineNumber: 15,
},
},
renderItemFormSidebar: {
name: 'renderItemFormSidebar',
comment: {
markdownText:
'This function will be called when the plugin needs to render a sidebar (see\nthe `itemFormSidebars` hook).',
tag: 'sidebarPanels',
},
nonCtxArguments: [
{
name: 'sidebarId',
typeName: 'string',
},
],
ctxArgument: {
type: 'ImposedSizePluginFrameCtx',
additionalProperties: [
{
name: 'ItemFormAdditionalProperties',
comment: {
markdownText:
"These information describe the current state of the form that's being shown\nto the end-user to edit a record.",
},
items: {
locale: {
comment: {
markdownText: 'The currently active locale for the record.',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 12,
},
type: 'string',
},
item: {
comment: {
markdownText:
'If an already persisted record is being edited, returns the full record\nentity.',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 17,
},
type: 'Item | null',
},
itemType: {
comment: {
markdownText: 'The model for the record being edited.',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 19,
},
type: 'ItemType',
},
formValues: {
comment: {
markdownText: 'The complete internal form state.',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 21,
},
type: 'Record<string, unknown>',
},
itemStatus: {
comment: {
markdownText:
'The current status of the record being edited.',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 23,
},
type: "'new' | 'draft' | 'updated' | 'published'",
},
isSubmitting: {
comment: {
markdownText:
'Whether the form is currently submitting itself or not.',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 25,
},
type: 'boolean',
},
isFormDirty: {
comment: {
markdownText:
'Whether the form has some non-persisted changes or not.',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 27,
},
type: 'boolean',
},
blocksAnalysis: {
comment: {
markdownText:
'Provides information on how many blocks are currently present in the form.',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 29,
},
type: 'BlocksAnalysis',
},
},
},
{
items: {
sidebarId: {
comment: {
markdownText:
'The ID of the sidebar that needs to be rendered.',
},
location: {
filePath: 'src/hooks/renderItemFormSidebar.ts',
lineNumber: 25,
},
type: 'string',
},
parameters: {
comment: {
markdownText:
'The arbitrary `parameters` of the declared in the `itemFormSidebars`\nfunction.',
},
location: {
filePath: 'src/hooks/renderItemFormSidebar.ts',
lineNumber: 30,
},
type: 'Record<string, unknown>',
},
},
},
],
additionalMethods: [
{
name: 'ItemFormAdditionalMethods',
comment: {
markdownText:
"These methods can be used to interact with the form that's being shown to the\nend-user to edit a record.",
},
items: {
toggleField: {
comment: {
markdownText:
'Hides/shows a specific field in the form. Please be aware that when a field\nis hidden, the field editor for that field will be removed from the DOM\nitself, including any associated plugins. When it is shown again, its\nplugins will be reinitialized.',
example:
"const fieldPath = prompt(\n 'Please insert the path of a field in the form',\n ctx.fieldPath,\n);\n\nawait ctx.toggleField(fieldPath, true);",
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 68,
},
type: '(path: string, show: boolean) => Promise<void>',
},
disableField: {
comment: {
markdownText:
'Disables/re-enables a specific field in the form.',
example:
"const fieldPath = prompt(\n 'Please insert the path of a field in the form',\n ctx.fieldPath,\n);\n\nawait ctx.disableField(fieldPath, true);",
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 83,
},
type: '(path: string, disable: boolean) => Promise<void>',
},
scrollToField: {
comment: {
markdownText:
'Smoothly navigates to a specific field in the form. If the field is\nlocalized it will switch language tab and then navigate to the chosen\nfield.',
example:
"const fieldPath = prompt(\n 'Please insert the path of a field in the form',\n ctx.fieldPath,\n);\n\nawait ctx.scrollToField(fieldPath);",
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 100,
},
type: '(path: string, locale?: string) => Promise<void>',
},
setFieldValue: {
comment: {
markdownText:
'Changes a specific path of the `formValues` object.',
example:
"const fieldPath = prompt(\n 'Please insert the path of a field in the form',\n ctx.fieldPath,\n);\n\nawait ctx.setFieldValue(fieldPath, 'new value');",
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 115,
},
type: '(path: string, value: unknown) => Promise<void>',
},
formValuesToItem: {
comment: {
markdownText:
'Takes the internal form state, and transforms it into an Item entity\ncompatible with DatoCMS API.\n\nWhen `skipUnchangedFields`, only the fields that changed value will be\nserialized.\n\nIf the required nested blocks are still not loaded, this method will return\n`undefined`.',
example: 'await ctx.formValuesToItem(ctx.formValues, false);',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 132,
},
type: "(\n formValues: Record<string, unknown>,\n skipUnchangedFields?: boolean,\n ) => Promise<Omit<Item, 'id' | 'meta'> | undefined>",
},
itemToFormValues: {
comment: {
markdownText:
'Takes an Item entity, and converts it into the internal form state.',
example: 'await ctx.itemToFormValues(ctx.item);',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 145,
},
type: "(\n item: Omit<Item, 'id' | 'meta'>,\n ) => Promise<Record<string, unknown>>",
},
saveCurrentItem: {
comment: {
markdownText: 'Triggers a submit form for current record.',
example: 'await ctx.saveCurrentItem();',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 157,
},
type: '(showToast?: boolean) => Promise<void>',
},
},
},
],
},
returnType: 'void',
location: {
filePath: 'src/hooks/renderItemFormSidebar.ts',
lineNumber: 15,
},
},
renderItemFormOutlet: {
name: 'renderItemFormOutlet',
comment: {
markdownText:
'This function will be called when the plugin needs to render an outlet\ndefined by the `itemFormOutlets()` hook.',
tag: 'outlets',
},
nonCtxArguments: [
{
name: 'itemFormOutletId',
typeName: 'string',
},
],
ctxArgument: {
type: 'SelfResizingPluginFrameCtx',
additionalProperties: [
{
name: 'ItemFormAdditionalProperties',
comment: {
markdownText:
"These information describe the current state of the form that's being shown\nto the end-user to edit a record.",
},
items: {
locale: {
comment: {
markdownText: 'The currently active locale for the record.',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 12,
},
type: 'string',
},
item: {
comment: {
markdownText:
'If an already persisted record is being edited, returns the full record\nentity.',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 17,
},
type: 'Item | null',
},
itemType: {
comment: {
markdownText: 'The model for the record being edited.',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 19,
},
type: 'ItemType',
},
formValues: {
comment: {
markdownText: 'The complete internal form state.',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 21,
},
type: 'Record<string, unknown>',
},
itemStatus: {
comment: {
markdownText:
'The current status of the record being edited.',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 23,
},
type: "'new' | 'draft' | 'updated' | 'published'",
},
isSubmitting: {
comment: {
markdownText:
'Whether the form is currently submitting itself or not.',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 25,
},
type: 'boolean',
},
isFormDirty: {
comment: {
markdownText:
'Whether the form has some non-persisted changes or not.',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 27,
},
type: 'boolean',
},
blocksAnalysis: {
comment: {
markdownText:
'Provides information on how many blocks are currently present in the form.',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 29,
},
type: 'BlocksAnalysis',
},
},
},
{
items: {
itemFormOutletId: {
comment: {
markdownText:
'The ID of the outlet that needs to be rendered.',
},
location: {
filePath: 'src/hooks/renderItemFormOutlet.ts',
lineNumber: 25,
},
type: 'string',
},
},
},
],
additionalMethods: [
{
name: 'ItemFormAdditionalMethods',
comment: {
markdownText:
"These methods can be used to interact with the form that's being shown to the\nend-user to edit a record.",
},
items: {
toggleField: {
comment: {
markdownText:
'Hides/shows a specific field in the form. Please be aware that when a field\nis hidden, the field editor for that field will be removed from the DOM\nitself, including any associated plugins. When it is shown again, its\nplugins will be reinitialized.',
example:
"const fieldPath = prompt(\n 'Please insert the path of a field in the form',\n ctx.fieldPath,\n);\n\nawait ctx.toggleField(fieldPath, true);",
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 68,
},
type: '(path: string, show: boolean) => Promise<void>',
},
disableField: {
comment: {
markdownText:
'Disables/re-enables a specific field in the form.',
example:
"const fieldPath = prompt(\n 'Please insert the path of a field in the form',\n ctx.fieldPath,\n);\n\nawait ctx.disableField(fieldPath, true);",
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 83,
},
type: '(path: string, disable: boolean) => Promise<void>',
},
scrollToField: {
comment: {
markdownText:
'Smoothly navigates to a specific field in the form. If the field is\nlocalized it will switch language tab and then navigate to the chosen\nfield.',
example:
"const fieldPath = prompt(\n 'Please insert the path of a field in the form',\n ctx.fieldPath,\n);\n\nawait ctx.scrollToField(fieldPath);",
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 100,
},
type: '(path: string, locale?: string) => Promise<void>',
},
setFieldValue: {
comment: {
markdownText:
'Changes a specific path of the `formValues` object.',
example:
"const fieldPath = prompt(\n 'Please insert the path of a field in the form',\n ctx.fieldPath,\n);\n\nawait ctx.setFieldValue(fieldPath, 'new value');",
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 115,
},
type: '(path: string, value: unknown) => Promise<void>',
},
formValuesToItem: {
comment: {
markdownText:
'Takes the internal form state, and transforms it into an Item entity\ncompatible with DatoCMS API.\n\nWhen `skipUnchangedFields`, only the fields that changed value will be\nserialized.\n\nIf the required nested blocks are still not loaded, this method will return\n`undefined`.',
example: 'await ctx.formValuesToItem(ctx.formValues, false);',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 132,
},
type: "(\n formValues: Record<string, unknown>,\n skipUnchangedFields?: boolean,\n ) => Promise<Omit<Item, 'id' | 'meta'> | undefined>",
},
itemToFormValues: {
comment: {
markdownText:
'Takes an Item entity, and converts it into the internal form state.',
example: 'await ctx.itemToFormValues(ctx.item);',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 145,
},
type: "(\n item: Omit<Item, 'id' | 'meta'>,\n ) => Promise<Record<string, unknown>>",
},
saveCurrentItem: {
comment: {
markdownText: 'Triggers a submit form for current record.',
example: 'await ctx.saveCurrentItem();',
},
location: {
filePath: 'src/ctx/commonExtras/itemForm.ts',
lineNumber: 157,
},
type: '(showToast?: boolean) => Promise<void>',
},
},
},
],
},
returnType: 'void',
location: {
filePath: 'src/hooks/renderItemFormOutlet.ts',
lineNumber: 15,
},
},
renderItemCollectionOutlet: {
name: 'renderItemCollectionOutlet',
comment: {
markdownText:
'This function will be called when the plugin needs to render an outlet\ndefined by the `itemCollectionOutlets()` hook.',
tag: 'outlets',
},
nonCtxArguments: [
{
name: 'itemCollectionOutletId',
typeName: 'string',
},
],
ctxArgument: {
type: 'SelfResizingPluginFrameCtx',
additionalProperties: [
{
items: {
itemCollectionOutletId: {
comment: {
markdownText:
'The ID of the outlet that needs to be rendered.',
},
location: {
filePath: 'src/hooks/renderItemCollectionOutlet.ts',
lineNumber: 24,
},
type: 'string',
},
itemType: {
comment: {
markdownText:
'The model for which the outlet is being rendered.',
},
location: {
filePath: 'src/hooks/renderItemCollectionOutlet.ts',
lineNumber: 26,
},
type: 'ItemType',
},
},
},
],
additionalMethods: [],
},
returnType: 'void',
location: {
filePath: 'src/hooks/renderItemCollectionOutlet.ts',
lineNumber: 14,
},
},
renderInspectorPanel: {
name: 'renderInspectorPanel',
comment: {
markdownText:
'This function will be called when an inspector needs to render a specific\npanel (see the `renderInspector` and `setInspectorMode` functions).',
tag: 'inspector',
},
nonCtxArguments: [
{
name: 'panelId',
typeName: 'string',
},
],
ctxArgument: {
type: 'ImposedSizePluginFrameCtx',
additionalProperties: [
{
items: {
panelId: {
comment: {
markdownText:
'The ID of the inspector panel that needs to be rendered.',
},
location: {
filePath: 'src/hooks/renderInspectorPanel.ts',
lineNumber: 18,
},
type: 'string',
},
parameters: {
comment: {
markdownText:
'The arbitrary `parameters` of the modal declared in the `setInspectorMode`\nfunction.',
},
location: {
filePath: 'src/hooks/renderInspectorPanel.ts',
lineNumber: 24,
},
type: 'Record<string, unknown>',
},
},
},
],
additionalMethods: [],
},
returnType: 'void',
location: {
filePath: 'src/hooks/renderInspectorPanel.ts',
lineNumber: 11,
},
},
renderInspector: {
name: 'renderInspector',
comment: {
markdownText:
'This function will be called when the plugin needs to render a specific\ninspector. Inspectors provide a side panel interface for displaying and\ninteracting with content alongside a custom interface.',
tag: 'inspector',
example:
"connect({\n renderInspector(inspectorId, ctx) {\n render(\n <div>\n <h1>Inspector: {inspectorId}</h1>\n <button onClick={() => ctx.setInspectorMode({\n type: 'itemEditor',\n itemId: 'some-item-id'\n })}>\n Show Item Editor\n </button>\n </div>\n );\n }\n});",
},
nonCtxArguments: [
{
name: 'inspectorId',
typeName: 'string',
},
],
ctxArgument: {
type: 'ImposedSizePluginFrameCtx',
additionalProperties: [
{
items: {
inspectorId: {
comment: {
markdownText:
'The ID of the inspector that needs to be rendered.',
},
location: {
filePath: 'src/hooks/renderInspector.ts',
lineNumber: 80,
},
type: 'string',
},
highlightedItemId: {
comment: {
markdownText:
'The ID of the record the currently is highlighted by the user.',
},
location: {
filePath: 'src/hooks/renderInspector.ts',
lineNumber: 83,
},
type: 'string | undefined',
},
location: {
comment: {
markdownText: 'Current page location.',
},
location: {
filePath: 'src/hooks/renderInspector.ts',
lineNumber: 86,
},
type: '{\n pathname: string;\n search: string;\n hash: string;\n }',
},
},
},
],
additionalMethods: [
{
items: {
setInspectorMode: {
comment: {
markdownText:
'Changes the current display mode of the inspector. This allows the plugin\nto dynamically switch between showing a record list, record editor, or custom\npanel within the inspector interface.',
example:
"// Switch to record editor mode\nawait ctx.setInspectorMode({\n type: 'itemEditor',\n itemId: 'item-123',\n fieldPath: 'title'\n});\n\n// Switch to record list mode\nawait ctx.setInspectorMode({ type: 'itemList' });\nawait ctx.setInspectorItemListData({\n title: 'Related Records',\n itemIds: ['item-1', 'item-2', 'item-3']\n});\n\n// Switch to custom panel mode\nawait ctx.setInspectorMode({\n type: 'customPanel',\n panelId: 'my-custom-panel',\n parameters: { filter: 'active' }\n});\n\n// Low intent mode change - won't interrupt editing with unsaved changes\nawait ctx.setInspectorMode(\n { type: 'itemList' },\n { ignoreIf