import {listen as listenForCommonEvents} from "./common-events";
import {scrollToQueryString} from "./scrolling";
import {listenForDragAndPaste} from "./drop-paste-handling";
+import {getPrimaryToolbar, registerAdditionalToolbars} from "./toolbars";
import {getPlugin as getCodeeditorPlugin} from "./plugin-codeeditor";
import {getPlugin as getDrawioPlugin} from "./plugin-drawio";
}
-/**
- * @param {WysiwygConfigOptions} options
- * @return {{toolbar: string, groupButtons: Object<string, Object>}}
- */
-function buildToolbar(options) {
- const textDirPlugins = options.textDirection === 'rtl' ? 'ltr rtl' : '';
-
- const groupButtons = {
- formatoverflow: {
- icon: 'more-drawer',
- tooltip: 'More',
- items: 'strikethrough superscript subscript inlinecode removeformat'
- },
- listoverflow: {
- icon: 'more-drawer',
- tooltip: 'More',
- items: 'outdent indent'
- },
- insertoverflow: {
- icon: 'more-drawer',
- tooltip: 'More',
- items: 'hr codeeditor drawio media details'
- }
- };
-
- const toolbar = [
- 'undo redo',
- 'styleselect',
- 'bold italic underline forecolor backcolor formatoverflow',
- 'alignleft aligncenter alignright alignjustify',
- 'bullist numlist listoverflow',
- textDirPlugins,
- 'link table imagemanager-insert insertoverflow',
- 'code about fullscreen'
- ];
-
- return {
- toolbar: toolbar.filter(row => Boolean(row)).join(' | '),
- groupButtons,
- };
-}
-
/**
* @param {WysiwygConfigOptions} options
* @return {string}
// Set language
window.tinymce.addI18n(options.language, options.translationMap);
- // Build toolbar content
- const {toolbar, groupButtons: toolBarGroupButtons} = buildToolbar(options);
// Return config object
return {
plugins: gatherPlugins(options),
imagetools_toolbar: 'imageoptions',
contextmenu: false,
- toolbar: toolbar,
+ toolbar: getPrimaryToolbar(options),
content_style: getContentStyle(options),
style_formats,
style_formats_merge: false,
head.innerHTML += fetchCustomHeadContent();
},
setup(editor) {
- for (const [key, config] of Object.entries(toolBarGroupButtons)) {
- editor.ui.registry.addGroupToolbarButton(key, config);
- }
+ registerAdditionalToolbars(editor, options);
getSetupCallback(options)(editor);
},
};
--- /dev/null
+/**
+ * @param {WysiwygConfigOptions} options
+ * @return {String}
+ */
+export function getPrimaryToolbar(options) {
+ const textDirPlugins = options.textDirection === 'rtl' ? 'ltr rtl' : '';
+
+ const toolbar = [
+ 'undo redo',
+ 'styleselect',
+ 'bold italic underline forecolor backcolor formatoverflow',
+ 'alignleft aligncenter alignright alignjustify',
+ 'bullist numlist listoverflow',
+ textDirPlugins,
+ 'link table imagemanager-insert insertoverflow',
+ 'code about fullscreen'
+ ];
+
+ return toolbar.filter(row => Boolean(row)).join(' | ');
+}
+
+/**
+ * @param {Editor} editor
+ */
+function registerPrimaryToolbarGroups(editor) {
+ editor.ui.registry.addGroupToolbarButton('formatoverflow', {
+ icon: 'more-drawer',
+ tooltip: 'More',
+ items: 'strikethrough superscript subscript inlinecode removeformat'
+ });
+ editor.ui.registry.addGroupToolbarButton('listoverflow', {
+ icon: 'more-drawer',
+ tooltip: 'More',
+ items: 'outdent indent'
+ });
+ editor.ui.registry.addGroupToolbarButton('insertoverflow', {
+ icon: 'more-drawer',
+ tooltip: 'More',
+ items: 'hr codeeditor drawio media details'
+ });
+}
+
+/**
+ * @param {Editor} editor
+ */
+function registerLinkContextToolbar(editor) {
+ editor.ui.registry.addContextToolbar('linkcontexttoolbar', {
+ predicate(node) {
+ return node.closest('a') !== null;
+ },
+ position: 'node',
+ scope: 'node',
+ items: 'link unlink openlink'
+ });
+}
+
+/**
+ * @param {Editor} editor
+ * @param {WysiwygConfigOptions} options
+ */
+export function registerAdditionalToolbars(editor, options) {
+ registerPrimaryToolbarGroups(editor);
+ registerLinkContextToolbar(editor);
+}
\ No newline at end of file