UNPKG

@ckeditor/ckeditor5-mention

Version:

Mention feature for CKEditor 5.

266 lines (265 loc) • 7.72 kB
/** * @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options */ /** * @module mention/mentionconfig */ /** * The configuration of the mention feature. * * Read more about {@glink features/mentions#configuration configuring the mention feature}. * * ```ts * ClassicEditor * .create( editorElement, { * mention: ... // Mention feature options. * } ) * .then( ... ) * .catch( ... ); * ``` * * See {@link module:core/editor/editorconfig~EditorConfig all editor options}. */ export interface MentionConfig { /** * The list of mention feeds supported by the editor. * * ```ts * ClassicEditor * .create( editorElement, { * plugins: [ Mention, ... ], * mention: { * feeds: [ * { * marker: '@', * feed: [ '@Barney', '@Lily', '@Marshall', '@Robin', '@Ted' ] * }, * ... * ] * } * } ) * .then( ... ) * .catch( ... ); * ``` * * You can provide many mention feeds but they must use different `marker`s. * For example, you can use `'@'` to autocomplete people and `'#'` to autocomplete tags. */ feeds: Array<MentionFeed>; /** * The configuration of the custom commit keys supported by the editor. * * ```ts * ClassicEditor * .create( editorElement, { * plugins: [ Mention, ... ], * mention: { * // [ Enter, Space ] * commitKeys: [ 13, 32 ] * feeds: [ * { ... } * ... * ] * } * } ) * .then( ... ) * .catch( ... ); * ``` * * Custom commit keys configuration allows you to customize how users will confirm the selection of mentions from the dropdown list. * You can add as many mention commit keys as you need. For instance, in the snippet above new mentions will be committed by pressing * either <kbd>Enter</kbd> or <kbd>Space</kbd> (13 and 32 key codes respectively). * * @default [ 13, 9 ] // [ Enter, Tab ] */ commitKeys?: Array<number>; /** * The configuration of the custom number of visible mentions. * * Customizing the number of visible mentions allows you to specify how many available elements will the users be able to see * in the dropdown list. You can specify any number you see fit. For example, in the snippets below you will find the * dropdownLimit set to `20` and `Infinity` (the latter will result in showing all available mentions). * * ```ts * ClassicEditor * .create( editorElement, { * plugins: [ Mention, ... ], * mention: { * dropdownLimit: 20, * feeds: [ * { ... } * ... * ] * } * } ) * .then( ... ) * .catch( ... ); * * ClassicEditor * .create( editorElement, { * plugins: [ Mention, ... ], * mention: { * dropdownLimit: Infinity, * feeds: [ * { ... } * ... * ] * } * } ) * .then( ... ) * .catch( ... ); * ``` * * @default 10 */ dropdownLimit?: number; } /** * The mention feed descriptor. Used in {@link module:mention/mentionconfig~MentionConfig `config.mention`}. * * See {@link module:mention/mentionconfig~MentionConfig} to learn more. * * ```ts * // Static configuration. * const mentionFeedPeople = { * marker: '@', * feed: [ '@Alice', '@Bob', ... ], * minimumCharacters: 2 * }; * * // Simple synchronous callback. * const mentionFeedTags = { * marker: '#', * feed: ( searchString: string ) => { * return tags * // Filter the tags list. * .filter( tag => { * return tag.toLowerCase().includes( queryText.toLowerCase() ); * } ) * } * }; * * const tags = [ 'wysiwyg', 'rte', 'rich-text-edior', 'collaboration', 'real-time', ... ]; * * // Asynchronous callback. * const mentionFeedPlaceholders = { * marker: '$', * feed: ( searchString: string ) => { * return getMatchingPlaceholders( searchString ); * } * }; * * function getMatchingPlaceholders( searchString: string ) { * return new Promise<Array<MentionFeedItem>>( resolve => { * doSomeXHRQuery( result => { * // console.log( result ); * // -> [ '$name', '$surname', '$postal', ... ] * * resolve( result ); * } ); * } ); * } * ``` */ export interface MentionFeed { /** * The character which triggers autocompletion for mention. It must be a single character. */ marker: string; /** * Autocomplete items. Provide an array for * a static configuration (the mention feature will show matching items automatically) or a function which returns an array of * matching items (directly, or via a promise). If a function is passed, it is executed in the context of the editor instance. */ feed: Array<MentionFeedItem> | FeedCallback; /** * Specifies after how many characters the autocomplete panel should be shown. * * @default 0 */ minimumCharacters?: number; /** * A function that renders a {@link module:mention/mentionconfig~MentionFeedItem} * to the autocomplete panel. */ itemRenderer?: ItemRenderer; /** * Specify how many available elements per feeds will the users be able to see in the dropdown list. * If it not set, limit is inherited from {@link module:mention/mentionconfig~MentionConfig#dropdownLimit MentionConfig}. */ dropdownLimit?: number; } /** * Function that renders an array of {@link module:mention/mentionconfig~MentionFeedItem} based on string input. */ export type FeedCallback = (searchString: string) => Array<MentionFeedItem> | Promise<Array<MentionFeedItem>>; /** * Function that takes renders a {@link module:mention/mentionconfig~MentionFeedObjectItem} as HTMLElement. */ export type ItemRenderer = (item: MentionFeedObjectItem) => HTMLElement | string; /** * The mention feed item. It may be defined as a string or a plain object. * * When defining a feed item as a plain object, the `id` property is obligatory. Additional properties * can be used when customizing the mention feature bahavior * (see {@glink features/mentions#customizing-the-autocomplete-list "Customizing the autocomplete list"} * and {@glink features/mentions#customizing-the-output "Customizing the output"} sections). * * ```ts * ClassicEditor * .create( editorElement, { * plugins: [ Mention, ... ], * mention: { * feeds: [ * // Feed items as objects. * { * marker: '@', * feed: [ * { * id: '@Barney', * fullName: 'Barney Bloom' * }, * { * id: '@Lily', * fullName: 'Lily Smith' * }, * { * id: '@Marshall', * fullName: 'Marshall McDonald' * }, * { * id: '@Robin', * fullName: 'Robin Hood' * }, * { * id: '@Ted', * fullName: 'Ted Cruze' * }, * // ... * ] * }, * * // Feed items as plain strings. * { * marker: '#', * feed: [ 'wysiwyg', 'rte', 'rich-text-edior', 'collaboration', 'real-time', ... ] * }, * ] * } * } ) * .then( ... ) * .catch( ... ); * ``` */ export type MentionFeedItem = string | MentionFeedObjectItem; export type MentionFeedObjectItem = { /** * A unique ID of the mention. It must start with the marker character. */ id: string; /** * Text inserted into the editor when creating a mention. */ text?: string; };