对话框的主体必须是 panel(单个面板)或 tabpanel(面板集合)。每个面板可以包含面板组件,这些组件可以是布局组件或基本组件,如输入框、按钮和文本。

panel

基本的对话框类型是 panel 对话框。面板是交互式面板组件的容器。面板类型对话框只有一个面板。

{
  type: 'panel',
  items: [ ... ] // array of panel components
}

tabpanel

tabpanel 对话框包含多个面板,并在对话框左侧有一个标签导航菜单,允许在面板之间切换。每个面板可以包含不同的面板组件,从而支持复杂的对话框。

每个标签面板通过以下配置选项定义:

名称类型要求描述

name

string

可选

标签的标识符。如果不指定,将分配一个随机生成的名称。

title

string

必需

导航菜单中标签的标题。

items

array

必需

要显示在面板内的面板组件数组。

不同标签中具有相同 name 的面板组件将在 对话框的数据对象中使用相同的值。这允许在标签之间传输数据。例如,charmap 和 emoticons 插件对话框在每个标签中都包含一个搜索输入字段。通过将所有搜索字段分配相同的名称,当用户切换标签时,在一个标签中输入的用户数据将被传输。
{
  type: 'tabpanel',
  tabs: [ // array of tab panel configurations
    {
      name: 'mytab',
      title: 'My Tab',
      items: [ ... ] // array of panel components
    },
    ... // more panel configurations
  ]
}

对话框实例 API 方法

对话框实例 API 包含 showTab("tabName") 方法,该方法允许使用标签的注册 name 以编程方式切换标签。

对话框配置事件回调

对话框可以配置 onTabChange 回调。当用户切换标签时会调用此函数。它接收对话框实例 API 和一个 details 对象,该对象包含 newTabName 和 oldTabName。

例如,当这很有用时,charmap 和 emoticons 插件对话框使用 newTabName 来更改搜索结果,以匹配当前标签表示的字符或表情符号类别。

示例:使用对话框 API

下面是如何使用 onTabChange 和 showTab() 的一个简单示例。

const dialogConfig = {
  title: 'Example Dialog',
  body: {
    type: 'tabpanel',
    tabs: [ ... ] // array of panel configurations
  },
  buttons: [],
  onTabChange: (dialogApi, details) => {
    // log the contents of details
    console.log(details.newTabName);
    console.log(details.oldTabName);

    // switch back to the old tab
    dialogApi.showTab(details.oldTabName);
  }
};

面板组件

面板可以包含布局组件和基本组件,其中包括用于显示信息以及用户交互和输入的组件。

不同标签中具有相同 name 的面板组件将在 对话框的数据对象中使用相同的值。这允许在标签之间传输数据。例如,charmap 和 emoticons 插件对话框在每个标签中都包含一个搜索输入字段。通过将所有搜索字段分配相同的名称,当用户切换标签时,在一个标签中输入的用户数据将被传输。

布局组件

一些面板组件可用于将布局应用于其他面板组件的数组。

bar

bar 是一种布局组件,可在对话框主体中创建一行项目。

{
  type: 'bar', // component type
  items: [ ... ] // array of panel components
}

collection

collection 是一种布局组件,可在对话框主体中创建一个包含一组小按钮的面板。例如,此组件用于 charmap 和 emoticons 插件的对话框中。

{
  type: 'collection', // component type
  name: 'collection-1', // identifier
  label: 'Collection Label'
}

要在集合中填充集合项,请在对话框的 initialData 属性中指定一个项数组。要更新集合中的项,请使用对话框 API 的 setData() 方法。每个项应包含 text、value 和 icon 属性。例如:

[
  {
    text: 'Bold',
    value: 'bold',
    icon: 'bold'
  },
  ... // 更多项目配置
]

grid

grid 是一种布局组件,可在对话框主体中创建列。

{
  type: 'grid', // 组件类型
  columns: 2, // 列数
  items: [ ... ] // 面板组件数组
}

label

label 是一种布局组件,可包裹其他组件,并在组件组上方添加标签。

{
  type: 'label', // 组件类型
  label: 'Caption', // 组标签的文本
  for: 'findtext', // 对话框标签组件的标识符
  items: [ ... ] // 面板组件数组
}

基本组件

这些面板组件用于显示信息或允许用户交互和输入。

alertbanner

alertbanner 是一种彩色横幅,旨在通知用户重要信息。alertbanner 有四种“级别”,每种级别以不同颜色显示。这些级别为:

  • info

  • warn

  • error

  • success

点击 alertbanner 中的图标会触发对话框配置中的 onAction 函数,并传递一个包含 alertbanner 组件的 name 和 value 的对象。若配置了 url 选项,则 value 为该选项的值,否则为空字符串。

名称类型是否必需描述

type

'alertbanner'

必需

组件类型。必须为 'alertbanner'。

text

字符串

必需

要在 alertbanner 中显示的 HTML 文本。

level

'info'、'warn'、'error' 或 'success'

必需

alertbanner 的级别,决定其样式。

icon

字符串

必需

要显示的图标的名称。必须对应以下之一:icon pack 中的图标、自定义 icon pack 中的图标,或通过 addIcon API 添加的图标。

url

字符串

可选

点击图标按钮时传递给 onAction 的 URL。

{
  type: 'alertbanner', // 组件类型
  level: 'info',
  text: 'An <strong>informative</strong> message to the user',
  url: 'http://my.url',
  icon: 'question'
}

button

button 是一种可点击组件,可包含文本或图标。按钮有两种类型(主按钮和次按钮),区别仅在于样式不同。主按钮旨在突出显示,颜色取决于所选的 skin。

面板按钮与 对话框页脚按钮不同。

事件:与 button 组件交互会触发对话框配置中的 onAction 函数,并在 details 对象中传递按钮的 name。这让开发者可以为每个按钮创建点击处理程序。

名称类型是否必需描述

type

'button'

必需

组件类型。必须为 'button'。

text

字符串

必需

若未指定 icon,则按钮显示的文本。也用于按钮的 title 属性。

name

字符串

可选

按钮的标识符。若未指定,按钮将被分配一个随机生成的名称。

icon

字符串

可选

要显示的图标的名称。必须对应以下之一:icon pack 中的图标、自定义 icon pack 中的图标,或通过 addIcon API 添加的图标。配置后,按钮将显示图标而非文本。

buttonType

'primary'、'secondary' 或 'toolbar'

可选

默认值:'secondary' - 是否将按钮样式设为主按钮、次按钮或工具栏按钮。

borderless

布尔值

可选

默认值:false - 是否将按钮样式设为无边框和背景色。

context

字符串

可选

默认值:mode:design - 该上下文属性会根据编辑器的当前状态动态启用或禁用按钮。仅当enabled为true时生效。详情请参阅:Context。

目前按钮不支持图标和文本混合显示。
{
  type: 'button', // 组件类型
  text: 'Alpha',
  buttonType: 'primary',
  name: 'alpha-button',
  enabled: true,
  borderless: false,
  context: 'mode:design'
}

checkbox

checkbox是一个复合组件,包含复选框和标签,具有on和off两种状态。

事件:与checkbox组件交互会触发对话框配置中的onChange函数。

{
  type: 'checkbox', // 组件类型
  name: 'checkbox-1', // 标识符
  label: 'Checkbox Label', // 标签文本
  enabled: true, // 启用状态
  context: 'mode:design' // 当编辑器处于设计模式时复选框激活,仅在enabled为true时有效
}

colorinput

colorinput是一个专用复合组件,包含标签、输入字段和按钮,点击按钮会打开颜色选择器弹出窗口。用户可直接在输入框中键入hex颜色代码,或通过颜色面板选择颜色。颜色面板按钮会随所选颜色变化。

{
  type: 'colorinput', // 组件类型
  name: 'colorinput', // 标识符
  label: 'Color Label', // 标签文本
  context: 'mode:design' // 当编辑器处于设计模式时颜色输入组件激活,仅在enabled为true时有效
}

colorpicker

colorpicker组件是一个直观的颜色选择工具,类似现代图像编辑器中的颜色选择器。支持通过RGB滑块选择颜色,或直接输入RGB或hex颜色值。

{
  type: 'colorpicker', // 组件类型
  name: 'colorpicker', // 标识符
}

dropzone

dropzone是一个复合组件,支持拖放操作或浏览文件,可将文件列表发送处理并接收结果。拖放区域上方会显示文本标签。

事件:与dropzone组件交互会触发对话框配置中的onChange函数。

名称类型必填说明

type

'dropzone'

必填

组件类型。必须为'dropzone'。

name

string

必填

dropzone的标识符。

label

string

可选

显示在拖放区域上方的标签文本。

dropAreaLabel

string

可选

默认值:'Drop an image here' - 可拖放文件的区域的文本标签。

buttonLabel

string

可选

默认值:'Browse for an image' - 浏览按钮的文本标签。

allowedFileTypes

string

可选

默认值:'image/*' - 指定允许的文件类型的MIME类型模式(如'image/*'、'application/pdf')。

allowedFileExtensions

array

可选

默认值:images_file_types - 允许的文件扩展名数组(如['.jpg', '.png', '.pdf'])。

context

string

可选

拖放区域激活的上下文条件(如'mode:design')。仅当enabled为true时生效。

{
  type: 'dropzone', // 组件类型
  name: 'dropzone', // 标识符
  label: 'Dropzone', // 标签文本
  dropAreaLabel: 'Drag and drop files here', // 拖放区域文本(默认值:'Drop an image here')
  buttonLabel: 'Browse files', // 浏览按钮文本(默认值:'Browse for an image')
  allowedFileTypes: 'image/*', // MIME类型模式(默认值:'image/*')
  allowedFileExtensions: ['.jpg', '.png', '.pdf'], // 允许的文件扩展名(默认值:images_file_types)
  context: 'mode:design' // 当编辑器处于设计模式时拖放区域激活
}

htmlpanel

htmlpanel组件可在对话框中渲染任意有效HTML内容。

尽管名称如此,HTMLpanel不能像panel和tabpanel那样作为主体组件使用。
{
  type: 'htmlpanel', // 组件类型
  html: '<div>Html goes here</div>'
}

iframe

iframe组件接收HTML文档字符串,并在对话框的iframe中显示。

如需用iframe替换整个对话框主体并通过URL加载内容,请使用URL dialog。
名称类型必填说明

type

'iframe'

必填

组件类型。必须为 'iframe'。

name

字符串

必填

按钮的标识符。

label

字符串

可选

用于 iframe 的 title 属性的字符串。

sandboxed

布尔值

可选

默认值:true - 当为 true 时,将 iframe 的 sandbox 属性设置为 "allow-scripts allow-same-origin"。

transparent

布尔值

可选

默认值:true - 当为 true 时,将 iframe 的背景设置为透明而非不透明。

{
  type: 'iframe', // 组件类型
  name: 'iframe', // 标识符
  label: 'iframe 的描述', // 用于 iframe 的 title 属性的文本
  sandboxed: true,
  transparent: true
}

要在对话框打开时设置 iframe 的内容,请在对话框的 initialData 属性中以字符串形式指定文档 HTML。要更新 iframe 的内容,请使用 对话框 API 的 setData() 方法。例如:

dialogApi.setData({
  iframe: '<!DOCTYPE html>' +
          '<html>' +
          '<head></head>' +
          '<body><p>此处为内容。</p></body>' +
          '</html>'
})

imagepreview

imagepreview 是一个专用组件,允许预览和缩放任何图像。

{
  type: 'imagepreview', // 组件类型
  name: 'preview', // 标识符
  height: '100px', // 用于限制图像预览的可选 CSS 高度
}

imagepreview 组件的对话框数据由 URL 和可选的缩放因子组成。

{
  url: 'https://www.example.com/image.png', // 图像 URL
  zoom: 1.5 // 可选缩放因子
}

input

input 是一个复合组件,渲染一个标签和一个单行文本输入字段。

事件: 与 input 组件交互将在用户输入时触发对话框配置中的 onChange 函数。

属性类型要求描述

type

'input'

必填

组件类型。必须为 'input'。

name

字符串

必填

输入的标识符。

label

字符串

可选

用于输入的 title 属性的字符串。

placeholder

字符串

可选

输入字段的占位符文本字符串。

enabled

布尔值

可选

允许禁用该字段。默认值为 true。

inputMode

字符串

可选

允许指定输入类型,以便在移动设备上显示上下文屏幕键盘。

context

字符串

可选

默认值:mode:design - context 属性根据编辑器的当前状态动态启用或禁用输入。详情请参阅:Context。

{
  type: 'input', // 组件类型
  name: 'inputA', // 标识符
  inputMode: 'text',
  label: '输入标签', // 标签的文本
  placeholder: '示例', // 输入的占位符文本
  enabled: true, // 启用状态
  maximized: false, // 扩展宽度以占据尽可能多的空间
  context: 'mode:design' // 当编辑器处于设计模式时输入处于活动状态,仅当 enabled 为 true 时生效
}

inputMode

inputMode 是 input 的一个属性。

使用 inputMode 设置当用户聚焦输入元素时在移动设备上提供的屏幕键盘类型。

有关有效输入模式的列表,请参阅:MDN Web Docs - inputmode。

listbox

listbox 是一个复合组件,带有标签和一个供用户选择的选项下拉列表。该组件显示类似菜单的下拉列表,并允许向用户显示嵌套选项。

事件: 与 listbox 组件交互将触发对话框配置中的 onChange 函数。

{
  type: 'listbox', // 组件类型
  name: 'ListBoxA', // 标识符
  label: 'ListBox 标签',
  enabled: true, // 启用状态
  items: [
    { text: '一', value: 'one' },
    { text: '二', value: 'two' },
    { text: '子菜单', items: [
      { text: '三', value: 'three' }
    ]}
  ],
  context: 'mode:design' // 当编辑器处于设计模式时 listbox 处于活动状态,仅当 enabled 为 true 时生效
}

selectbox

selectbox 是一个复合组件,带有标签和一个供用户选择的单个选项下拉列表。

事件: 与 selectbox 组件交互将触发对话框配置中的 onChange 函数。

{
  type: 'selectbox', // 组件类型
  name: 'SelectA', // 标识符
  label: '选择标签',
  enabled: true, // 启用状态
  size: 1, // 可见值数量(可选)
  items: [
    { value: 'one', text: 'One' },
    { value: 'two', text: 'Two' }
  ],
  context: 'mode:design' // 当编辑器处于设计模式时 selectbox 激活,仅在 enabled 为 true 时生效
}

sizeinput

sizeinput 是一个专用的复合组件,包含两个标记为“Width”和“Height”的输入字段以及一个“ratio lock”按钮。它用于设置内容元素的尺寸。

事件: 与 sizeinput 组件的输入字段交互将在用户点击离开组件时触发对话框配置中的 onChange 函数。

{
  type: 'sizeinput', // 组件类型
  name: 'size', // 标识符
  label: 'Dimensions',
  enabled: true, // 启用状态
  context: 'mode:design' // 当编辑器处于设计模式时 sizeinput 激活,仅在 enabled 为 true 时生效
}

slider

slider 是一个带有标签和水平滑动条的专用组件。可用于让用户在指定范围内选择一个值。

事件: 与 slider 组件交互将在用户释放滑块时触发对话框配置中的 onChange 函数。

{
  type: 'slider', // 组件类型
  name: 'vol', // 标识符
  label: 'Volume',
  min: 0, // 最小值
  max: 100 // 最大值
}

table

table 是用于渲染简单表格的布局组件。

{
  type: 'table', // 组件类型
  header: [ 'Heading 1', 'Heading 2', 'Heading 3' ],
  cells: [
    [ 'Cell 1', 'Cell 2', 'Cell 3' ],
    [ 'Cell 4', 'Cell 5', 'Cell 6' ]
  ]
}

textarea

textarea 是多行文本字段。

事件: 与 textbox 组件交互将触发对话框配置中的 onChange 函数。

{
  type: 'textarea', // 组件类型
  name: 'text-a', // 标识符
  label: 'Text: ',
  placeholder: 'example',
  enabled: true, // 启用状态
  maximized: false, // 宽度扩展以占据尽可能多的空间
  context: 'mode:design' // 当编辑器处于设计模式时 textarea 激活,仅在 enabled 为 true 时生效
}

tree

tree 是用于呈现树形结构的组件。例如包含其他文件夹和文件的文件夹列表。

tree 可以包含两种不同的项:

  • 一个目录;以及

  • 一个叶子。

目录项可以包含其他目录项和叶子项。

此外,tree 项可以设置为 fetch 其他 TinyMCE 菜单。

激活树中的项

激活目录项会在两个状态之间切换项:折叠和展开。

激活叶子项会触发 onLeafAction 回调函数。

项可通过点击、按键或键盘导航激活。

使用键盘进行树导航和激活

  • 向上或向下箭头键高亮项。

  • 如果高亮项是目录,向左或向右箭头键会折叠或展开目录项。

  • 如果高亮项是叶子,按下Return键会触发 onLeafAction 回调函数。

onLeafAction: 与 tree 组件交互将执行在对话框配置中设置的 onLeafAction 回调函数。

tinymce.init({
  selector: "textarea",
  toolbar: "tree",
  setup: (ed) => {
    ed.ui.registry.addButton('tree', {
      text: 'Tree toolbar button',
      onAction: () => {
        ed.windowManager.open({
          title: 'Tree dialog',
          buttons: [{
	    type: 'cancel',
	    text: 'Cancel'
	  }],
          body : {
            type: 'panel',
            items: [{
              type: 'tree',
              onLeafAction: (id) => {
                console.log('clicked on item with id', id);
              },
              items: [
                {
                  type: 'directory',
                  id: 'dir',
                  title: 'Directory',
                  menu: {
                    icon: 'image-options',
                    type: 'menubutton',
                    fetch: (success) => success([
                      'bold',
                      'italic',
                      'underline',
                      {
                          type: 'menuitem',
                          text: 'Menu item',
                          onAction: () => {
                            console.log('dir menu item');
                          }
                      }
                    ])
                  },
                  children: [
                    {
                      type: 'leaf',
                      title: 'Leaf 3',
                      id: '3'
                    },
                    {
                      type: 'leaf',
                      title: 'Leaf 4',
                      id: '4',
                      menu: {
                        icon: 'image-options',
                        type: 'menubutton',
                        fetch: (success) => success([
                          'blocks',
                          'fontfamily',
                          'fontsize',
                          {
                            type: 'menuitem',
                            text: 'Menu item',
                            onAction: () => {
                              console.log('leaf menu item'); // 为了演示目的
                            }
                          }
                        ])
                      }
                    },
                  ]
                },
                {
                  type: 'leaf',
                  title: 'Leaf 5',
                  id: '5'
                },
                {
                  type: 'leaf',
                  title: 'Leaf 6',
                  id: '6'
                },
              ]
            }]
          }
        });
      }
    });
  },
});

urlinput

urlinput 是一个专用的复合组件,用于URL输入或文件上传。它包含一个标签、一个文本输入框和一个可选的文件选择器按钮。urlinput组件还包括一个 typeahead 下拉菜单,会显示与当前输入文本匹配的之前输入的URL,并在用户输入时更新。

只有配置了 file_picker_callback 时,文件选择器按钮才会显示。

事件:与 selectbox 组件交互时,当用户点击离开该组件时,将触发对话框配置中的 onChange 函数。

名称类型是否必需描述

type

'urlinput'

必需

组件类型。必须是 'urlinput'。

name

string

必需

urlinput的标识符。

label

string

可选

用作标签的字符串。

filetype

'file' 或

'image' 或

'media'

可选

默认值:'file'。

限制可通过文件选择器上传的文件类型。

默认值——file——允许任何类型,包括文档链接。

此选项需要配置 file_picker_callback。

enabled

boolean

可选

默认:true

组件是否应初始禁用。

picker_text

string

可选

为文件选择器按钮设置替代的工具提示。

如果未指定 picker_text,工具提示默认使用 label 属性提供的值。

此选项需要配置 file_picker_callback。

context

string

可选

默认:mode:design - context属性根据编辑器的当前状态动态启用或禁用urlinput。详细信息请参见:Context。

urlinput 示例

用于链接的urlinput

文件选择器将接受任何文件类型;typeahead将包含5个之前输入的URL以及文档中的所有锚点目标和标题;文件选择器按钮将有一个自定义工具提示。

{
  type: 'urlinput', // 组件类型
  name: 'url', // 标识符
  filetype: 'file', // 允许任何文件类型
  label: 'Url', // 组件标签的文本
  enabled: true, // 启用状态
  picker_text: 'Find local files', // 为文件选择器按钮设置自定义提示文本
  context: 'mode:design' // 当编辑器处于设计模式时,urlinput 才处于活动状态,仅在 enabled 为 true 时生效
}

用于图像上传的 urlinput

文件选择器将仅接受图像,并且自动补全功能将包含之前输入过的5个图像URL。

{
  type: 'urlinput', // 组件类型
  name: 'src', // 标识符
  filetype: 'image', // 将文件类型限制为图像类型
  label: 'Source', // 组件标签的文本
  enabled: true, // 启用状态
  context: 'mode:design' // 当编辑器处于设计模式时,urlinput 才处于活动状态,仅在 enabled 为 true 时生效
}