@ckeditor/ckeditor5-mention 0.0.0-nightly-20240605.0 → 0.0.0-nightly-20240606.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.
- package/README.md +6 -0
- package/dist/index.js +262 -189
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -15,6 +15,12 @@ Check out the demo in the [mentions (autocomplete) feature guide](https://ckedit
|
|
|
15
15
|
|
|
16
16
|
See the [`@ckeditor/ckeditor5-mention` package](https://ckeditor.com/docs/ckeditor5/latest/api/mention.html) page in [CKEditor 5 documentation](https://ckeditor.com/docs/ckeditor5/latest/).
|
|
17
17
|
|
|
18
|
+
## Installation
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install ckeditor5
|
|
22
|
+
```
|
|
23
|
+
|
|
18
24
|
## License
|
|
19
25
|
|
|
20
26
|
Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). For full details about the license, please check the `LICENSE.md` file or [https://ckeditor.com/legal/ckeditor-oss-license](https://ckeditor.com/legal/ckeditor-oss-license).
|
package/dist/index.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
|
4
4
|
*/
|
|
5
5
|
import { Command, Plugin } from '@ckeditor/ckeditor5-core/dist/index.js';
|
|
6
|
-
import { CKEditorError, toMap, uid, Rect, keyCodes,
|
|
6
|
+
import { CKEditorError, toMap, uid, Rect, keyCodes, Collection, logWarning, env } from '@ckeditor/ckeditor5-utils/dist/index.js';
|
|
7
7
|
import { ListView, View, ListItemView, ContextualBalloon, clickOutsideHandler, ButtonView } from '@ckeditor/ckeditor5-ui/dist/index.js';
|
|
8
8
|
import { TextWatcher } from '@ckeditor/ckeditor5-typing/dist/index.js';
|
|
9
9
|
import { debounce } from 'lodash-es';
|
|
@@ -13,27 +13,69 @@ const BRACKET_PAIRS = {
|
|
|
13
13
|
'[': ']',
|
|
14
14
|
'{': '}'
|
|
15
15
|
};
|
|
16
|
-
|
|
16
|
+
/**
|
|
17
|
+
* The mention command.
|
|
18
|
+
*
|
|
19
|
+
* The command is registered by {@link module:mention/mentionediting~MentionEditing} as `'mention'`.
|
|
20
|
+
*
|
|
21
|
+
* To insert a mention into a range, execute the command and specify a mention object with a range to replace:
|
|
22
|
+
*
|
|
23
|
+
* ```ts
|
|
24
|
+
* const focus = editor.model.document.selection.focus;
|
|
25
|
+
*
|
|
26
|
+
* // It will replace one character before the selection focus with the '#1234' text
|
|
27
|
+
* // with the mention attribute filled with passed attributes.
|
|
28
|
+
* editor.execute( 'mention', {
|
|
29
|
+
* marker: '#',
|
|
30
|
+
* mention: {
|
|
31
|
+
* id: '#1234',
|
|
32
|
+
* name: 'Foo',
|
|
33
|
+
* title: 'Big Foo'
|
|
34
|
+
* },
|
|
35
|
+
* range: editor.model.createRange( focus.getShiftedBy( -1 ), focus )
|
|
36
|
+
* } );
|
|
37
|
+
*
|
|
38
|
+
* // It will replace one character before the selection focus with the 'The "Big Foo"' text
|
|
39
|
+
* // with the mention attribute filled with passed attributes.
|
|
40
|
+
* editor.execute( 'mention', {
|
|
41
|
+
* marker: '#',
|
|
42
|
+
* mention: {
|
|
43
|
+
* id: '#1234',
|
|
44
|
+
* name: 'Foo',
|
|
45
|
+
* title: 'Big Foo'
|
|
46
|
+
* },
|
|
47
|
+
* text: 'The "Big Foo"',
|
|
48
|
+
* range: editor.model.createRange( focus.getShiftedBy( -1 ), focus )
|
|
49
|
+
* } );
|
|
50
|
+
* ```
|
|
51
|
+
*/ class MentionCommand extends Command {
|
|
17
52
|
/**
|
|
18
|
-
|
|
19
|
-
|
|
53
|
+
* @inheritDoc
|
|
54
|
+
*/ constructor(editor){
|
|
55
|
+
super(editor);
|
|
56
|
+
// Since this command may pass range in execution parameters, it should be checked directly in execute block.
|
|
57
|
+
this._isEnabledBasedOnSelection = false;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* @inheritDoc
|
|
61
|
+
*/ refresh() {
|
|
20
62
|
const model = this.editor.model;
|
|
21
63
|
const doc = model.document;
|
|
22
64
|
this.isEnabled = model.schema.checkAttributeInSelection(doc.selection, 'mention');
|
|
23
65
|
}
|
|
24
66
|
/**
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
67
|
+
* Executes the command.
|
|
68
|
+
*
|
|
69
|
+
* @param options Options for the executed command.
|
|
70
|
+
* @param options.mention The mention object to insert. When a string is passed, it will be used to create a plain
|
|
71
|
+
* object with the name attribute that equals the passed string.
|
|
72
|
+
* @param options.marker The marker character (e.g. `'@'`).
|
|
73
|
+
* @param options.text The text of the inserted mention. Defaults to the full mention string composed from `marker` and
|
|
74
|
+
* `mention` string or `mention.id` if an object is passed.
|
|
75
|
+
* @param options.range The range to replace.
|
|
76
|
+
* Note that the replaced range might be shorter than the inserted text with the mention attribute.
|
|
77
|
+
* @fires execute
|
|
78
|
+
*/ execute(options) {
|
|
37
79
|
const model = this.editor.model;
|
|
38
80
|
const document = model.document;
|
|
39
81
|
const selection = document.selection;
|
|
@@ -53,47 +95,47 @@ class MentionCommand extends Command {
|
|
|
53
95
|
}, mentionData);
|
|
54
96
|
if (options.marker.length != 1) {
|
|
55
97
|
/**
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
98
|
+
* The marker must be a single character.
|
|
99
|
+
*
|
|
100
|
+
* Correct markers: `'@'`, `'#'`.
|
|
101
|
+
*
|
|
102
|
+
* Incorrect markers: `'@@'`, `'[@'`.
|
|
103
|
+
*
|
|
104
|
+
* See {@link module:mention/mentionconfig~MentionConfig}.
|
|
105
|
+
*
|
|
106
|
+
* @error mentioncommand-incorrect-marker
|
|
107
|
+
*/ throw new CKEditorError('mentioncommand-incorrect-marker', this);
|
|
66
108
|
}
|
|
67
109
|
if (mentionID.charAt(0) != options.marker) {
|
|
68
110
|
/**
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
111
|
+
* The feed item ID must start with the marker character.
|
|
112
|
+
*
|
|
113
|
+
* Correct mention feed setting:
|
|
114
|
+
*
|
|
115
|
+
* ```ts
|
|
116
|
+
* mentions: [
|
|
117
|
+
* {
|
|
118
|
+
* marker: '@',
|
|
119
|
+
* feed: [ '@Ann', '@Barney', ... ]
|
|
120
|
+
* }
|
|
121
|
+
* ]
|
|
122
|
+
* ```
|
|
123
|
+
*
|
|
124
|
+
* Incorrect mention feed setting:
|
|
125
|
+
*
|
|
126
|
+
* ```ts
|
|
127
|
+
* mentions: [
|
|
128
|
+
* {
|
|
129
|
+
* marker: '@',
|
|
130
|
+
* feed: [ 'Ann', 'Barney', ... ]
|
|
131
|
+
* }
|
|
132
|
+
* ]
|
|
133
|
+
* ```
|
|
134
|
+
*
|
|
135
|
+
* See {@link module:mention/mentionconfig~MentionConfig}.
|
|
136
|
+
*
|
|
137
|
+
* @error mentioncommand-incorrect-id
|
|
138
|
+
*/ throw new CKEditorError('mentioncommand-incorrect-id', this);
|
|
97
139
|
}
|
|
98
140
|
model.change((writer)=>{
|
|
99
141
|
const currentAttributes = toMap(selection.getAttributes());
|
|
@@ -120,24 +162,23 @@ class MentionCommand extends Command {
|
|
|
120
162
|
}
|
|
121
163
|
});
|
|
122
164
|
}
|
|
123
|
-
/**
|
|
124
|
-
* @inheritDoc
|
|
125
|
-
*/ constructor(editor){
|
|
126
|
-
super(editor);
|
|
127
|
-
// Since this command may pass range in execution parameters, it should be checked directly in execute block.
|
|
128
|
-
this._isEnabledBasedOnSelection = false;
|
|
129
|
-
}
|
|
130
165
|
}
|
|
131
166
|
|
|
132
|
-
|
|
167
|
+
/**
|
|
168
|
+
* The mention editing feature.
|
|
169
|
+
*
|
|
170
|
+
* It introduces the {@link module:mention/mentioncommand~MentionCommand command} and the `mention`
|
|
171
|
+
* attribute in the {@link module:engine/model/model~Model model} which renders in the {@link module:engine/view/view view}
|
|
172
|
+
* as a `<span class="mention" data-mention="@mention">`.
|
|
173
|
+
*/ class MentionEditing extends Plugin {
|
|
133
174
|
/**
|
|
134
|
-
|
|
135
|
-
|
|
175
|
+
* @inheritDoc
|
|
176
|
+
*/ static get pluginName() {
|
|
136
177
|
return 'MentionEditing';
|
|
137
178
|
}
|
|
138
179
|
/**
|
|
139
|
-
|
|
140
|
-
|
|
180
|
+
* @inheritDoc
|
|
181
|
+
*/ init() {
|
|
141
182
|
const editor = this.editor;
|
|
142
183
|
const model = editor.model;
|
|
143
184
|
const doc = model.document;
|
|
@@ -341,39 +382,56 @@ class MentionEditing extends Plugin {
|
|
|
341
382
|
return false;
|
|
342
383
|
}
|
|
343
384
|
|
|
344
|
-
|
|
385
|
+
/**
|
|
386
|
+
* The mention ui view.
|
|
387
|
+
*/ class MentionsView extends ListView {
|
|
388
|
+
selected;
|
|
389
|
+
position;
|
|
345
390
|
/**
|
|
346
|
-
|
|
347
|
-
|
|
391
|
+
* @inheritDoc
|
|
392
|
+
*/ constructor(locale){
|
|
393
|
+
super(locale);
|
|
394
|
+
this.extendTemplate({
|
|
395
|
+
attributes: {
|
|
396
|
+
class: [
|
|
397
|
+
'ck-mentions'
|
|
398
|
+
],
|
|
399
|
+
tabindex: '-1'
|
|
400
|
+
}
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* {@link #select Selects} the first item.
|
|
405
|
+
*/ selectFirst() {
|
|
348
406
|
this.select(0);
|
|
349
407
|
}
|
|
350
408
|
/**
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
409
|
+
* Selects next item to the currently {@link #select selected}.
|
|
410
|
+
*
|
|
411
|
+
* If the last item is already selected, it will select the first item.
|
|
412
|
+
*/ selectNext() {
|
|
355
413
|
const item = this.selected;
|
|
356
414
|
const index = this.items.getIndex(item);
|
|
357
415
|
this.select(index + 1);
|
|
358
416
|
}
|
|
359
417
|
/**
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
418
|
+
* Selects previous item to the currently {@link #select selected}.
|
|
419
|
+
*
|
|
420
|
+
* If the first item is already selected, it will select the last item.
|
|
421
|
+
*/ selectPrevious() {
|
|
364
422
|
const item = this.selected;
|
|
365
423
|
const index = this.items.getIndex(item);
|
|
366
424
|
this.select(index - 1);
|
|
367
425
|
}
|
|
368
426
|
/**
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
427
|
+
* Marks item at a given index as selected.
|
|
428
|
+
*
|
|
429
|
+
* Handles selection cycling when passed index is out of bounds:
|
|
430
|
+
* - if the index is lower than 0, it will select the last item,
|
|
431
|
+
* - if the index is higher than the last item index, it will select the first item.
|
|
432
|
+
*
|
|
433
|
+
* @param index Index of an item to be marked as selected.
|
|
434
|
+
*/ select(index) {
|
|
377
435
|
let indexToGet = 0;
|
|
378
436
|
if (index > 0 && index < this.items.length) {
|
|
379
437
|
indexToGet = index;
|
|
@@ -397,51 +455,34 @@ class MentionsView extends ListView {
|
|
|
397
455
|
}
|
|
398
456
|
}
|
|
399
457
|
/**
|
|
400
|
-
|
|
401
|
-
|
|
458
|
+
* Triggers the `execute` event on the {@link #select selected} item.
|
|
459
|
+
*/ executeSelected() {
|
|
402
460
|
this.selected.fire('execute');
|
|
403
461
|
}
|
|
404
462
|
/**
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
463
|
+
* Checks if an item is visible in the scrollable area.
|
|
464
|
+
*
|
|
465
|
+
* The item is considered visible when:
|
|
466
|
+
* - its top boundary is inside the scrollable rect
|
|
467
|
+
* - its bottom boundary is inside the scrollable rect (the whole item must be visible)
|
|
468
|
+
*/ _isItemVisibleInScrolledArea(item) {
|
|
411
469
|
return new Rect(this.element).contains(new Rect(item.element));
|
|
412
470
|
}
|
|
413
|
-
/**
|
|
414
|
-
* @inheritDoc
|
|
415
|
-
*/ constructor(locale){
|
|
416
|
-
super(locale);
|
|
417
|
-
this.extendTemplate({
|
|
418
|
-
attributes: {
|
|
419
|
-
class: [
|
|
420
|
-
'ck-mentions'
|
|
421
|
-
],
|
|
422
|
-
tabindex: '-1'
|
|
423
|
-
}
|
|
424
|
-
});
|
|
425
|
-
}
|
|
426
471
|
}
|
|
427
472
|
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
this.element = this.domElement;
|
|
434
|
-
}
|
|
473
|
+
/**
|
|
474
|
+
* This class wraps DOM element as a CKEditor5 UI View.
|
|
475
|
+
*
|
|
476
|
+
* It allows to render any DOM element and use it in mentions list.
|
|
477
|
+
*/ class DomWrapperView extends View {
|
|
435
478
|
/**
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
this.domElement.focus();
|
|
439
|
-
}
|
|
479
|
+
* The DOM element for which wrapper was created.
|
|
480
|
+
*/ domElement;
|
|
440
481
|
/**
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
482
|
+
* Creates an instance of {@link module:mention/ui/domwrapperview~DomWrapperView} class.
|
|
483
|
+
*
|
|
484
|
+
* Also see {@link #render}.
|
|
485
|
+
*/ constructor(locale, domElement){
|
|
445
486
|
super(locale);
|
|
446
487
|
// Disable template rendering on this view.
|
|
447
488
|
this.template = undefined;
|
|
@@ -464,9 +505,22 @@ class DomWrapperView extends View {
|
|
|
464
505
|
this.fire('execute');
|
|
465
506
|
});
|
|
466
507
|
}
|
|
508
|
+
/**
|
|
509
|
+
* @inheritDoc
|
|
510
|
+
*/ render() {
|
|
511
|
+
super.render();
|
|
512
|
+
this.element = this.domElement;
|
|
513
|
+
}
|
|
514
|
+
/**
|
|
515
|
+
* Focuses the DOM element.
|
|
516
|
+
*/ focus() {
|
|
517
|
+
this.domElement.focus();
|
|
518
|
+
}
|
|
467
519
|
}
|
|
468
520
|
|
|
469
521
|
class MentionListItemView extends ListItemView {
|
|
522
|
+
item;
|
|
523
|
+
marker;
|
|
470
524
|
highlight() {
|
|
471
525
|
const child = this.children.first;
|
|
472
526
|
child.isOn = true;
|
|
@@ -489,22 +543,49 @@ const defaultCommitKeyCodes = [
|
|
|
489
543
|
keyCodes.enter,
|
|
490
544
|
keyCodes.tab
|
|
491
545
|
];
|
|
492
|
-
|
|
546
|
+
/**
|
|
547
|
+
* The mention UI feature.
|
|
548
|
+
*/ class MentionUI extends Plugin {
|
|
549
|
+
/**
|
|
550
|
+
* The mention view.
|
|
551
|
+
*/ _mentionsView;
|
|
552
|
+
/**
|
|
553
|
+
* Stores mention feeds configurations.
|
|
554
|
+
*/ _mentionsConfigurations;
|
|
555
|
+
/**
|
|
556
|
+
* The contextual balloon plugin instance.
|
|
557
|
+
*/ _balloon;
|
|
558
|
+
_items = new Collection();
|
|
559
|
+
_lastRequested;
|
|
560
|
+
/**
|
|
561
|
+
* Debounced feed requester. It uses `lodash#debounce` method to delay function call.
|
|
562
|
+
*/ _requestFeedDebounced;
|
|
493
563
|
/**
|
|
494
|
-
|
|
495
|
-
|
|
564
|
+
* @inheritDoc
|
|
565
|
+
*/ static get pluginName() {
|
|
496
566
|
return 'MentionUI';
|
|
497
567
|
}
|
|
498
568
|
/**
|
|
499
|
-
|
|
500
|
-
|
|
569
|
+
* @inheritDoc
|
|
570
|
+
*/ static get requires() {
|
|
501
571
|
return [
|
|
502
572
|
ContextualBalloon
|
|
503
573
|
];
|
|
504
574
|
}
|
|
505
575
|
/**
|
|
506
|
-
|
|
507
|
-
|
|
576
|
+
* @inheritDoc
|
|
577
|
+
*/ constructor(editor){
|
|
578
|
+
super(editor);
|
|
579
|
+
this._mentionsView = this._createMentionView();
|
|
580
|
+
this._mentionsConfigurations = new Map();
|
|
581
|
+
this._requestFeedDebounced = debounce(this._requestFeed, 100);
|
|
582
|
+
editor.config.define('mention', {
|
|
583
|
+
feeds: []
|
|
584
|
+
});
|
|
585
|
+
}
|
|
586
|
+
/**
|
|
587
|
+
* @inheritDoc
|
|
588
|
+
*/ init() {
|
|
508
589
|
const editor = this.editor;
|
|
509
590
|
const commitKeys = editor.config.get('mention.commitKeys') || defaultCommitKeyCodes;
|
|
510
591
|
const handledKeyCodes = defaultHandledKeyCodes.concat(commitKeys);
|
|
@@ -544,17 +625,17 @@ class MentionUI extends Plugin {
|
|
|
544
625
|
const { feed, marker, dropdownLimit } = mentionDescription;
|
|
545
626
|
if (!isValidMentionMarker(marker)) {
|
|
546
627
|
/**
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
628
|
+
* The marker must be a single character.
|
|
629
|
+
*
|
|
630
|
+
* Correct markers: `'@'`, `'#'`.
|
|
631
|
+
*
|
|
632
|
+
* Incorrect markers: `'$$'`, `'[@'`.
|
|
633
|
+
*
|
|
634
|
+
* See {@link module:mention/mentionconfig~MentionConfig}.
|
|
635
|
+
*
|
|
636
|
+
* @error mentionconfig-incorrect-marker
|
|
637
|
+
* @param marker Configured marker
|
|
638
|
+
*/ throw new CKEditorError('mentionconfig-incorrect-marker', null, {
|
|
558
639
|
marker
|
|
559
640
|
});
|
|
560
641
|
}
|
|
@@ -575,27 +656,27 @@ class MentionUI extends Plugin {
|
|
|
575
656
|
this.on('requestFeed:response', (evt, data)=>this._handleFeedResponse(data));
|
|
576
657
|
this.on('requestFeed:error', ()=>this._hideUIAndRemoveMarker());
|
|
577
658
|
/**
|
|
578
|
-
|
|
579
|
-
|
|
659
|
+
* Checks if a given key code is handled by the mention UI.
|
|
660
|
+
*/ function isHandledKey(keyCode) {
|
|
580
661
|
return handledKeyCodes.includes(keyCode);
|
|
581
662
|
}
|
|
582
663
|
}
|
|
583
664
|
/**
|
|
584
|
-
|
|
585
|
-
|
|
665
|
+
* @inheritDoc
|
|
666
|
+
*/ destroy() {
|
|
586
667
|
super.destroy();
|
|
587
668
|
// Destroy created UI components as they are not automatically destroyed (see ckeditor5#1341).
|
|
588
669
|
this._mentionsView.destroy();
|
|
589
670
|
}
|
|
590
671
|
/**
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
672
|
+
* Returns true when {@link #_mentionsView} is in the {@link module:ui/panel/balloon/contextualballoon~ContextualBalloon} and it is
|
|
673
|
+
* currently visible.
|
|
674
|
+
*/ get _isUIVisible() {
|
|
594
675
|
return this._balloon.visibleView === this._mentionsView;
|
|
595
676
|
}
|
|
596
677
|
/**
|
|
597
|
-
|
|
598
|
-
|
|
678
|
+
* Creates the {@link #_mentionsView}.
|
|
679
|
+
*/ _createMentionView() {
|
|
599
680
|
const locale = this.editor.locale;
|
|
600
681
|
const mentionsView = new MentionsView(locale);
|
|
601
682
|
mentionsView.items.bindTo(this._items).using((data)=>{
|
|
@@ -642,14 +723,14 @@ class MentionUI extends Plugin {
|
|
|
642
723
|
return mentionsView;
|
|
643
724
|
}
|
|
644
725
|
/**
|
|
645
|
-
|
|
646
|
-
|
|
726
|
+
* Returns item renderer for the marker.
|
|
727
|
+
*/ _getItemRenderer(marker) {
|
|
647
728
|
const { itemRenderer } = this._mentionsConfigurations.get(marker);
|
|
648
729
|
return itemRenderer;
|
|
649
730
|
}
|
|
650
731
|
/**
|
|
651
|
-
|
|
652
|
-
|
|
732
|
+
* Requests a feed from a configured callbacks.
|
|
733
|
+
*/ _requestFeed(marker, feedText) {
|
|
653
734
|
// @if CK_DEBUG_MENTION // console.log( '%c[Feed]%c Requesting for', 'color: blue', 'color: black', `"${ feedText }"` );
|
|
654
735
|
// Store the last requested feed - it is used to discard any out-of order requests.
|
|
655
736
|
this._lastRequested = feedText;
|
|
@@ -688,18 +769,18 @@ class MentionUI extends Plugin {
|
|
|
688
769
|
error
|
|
689
770
|
});
|
|
690
771
|
/**
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
772
|
+
* The callback used for obtaining mention autocomplete feed thrown and error and the mention UI was hidden or
|
|
773
|
+
* not displayed at all.
|
|
774
|
+
*
|
|
775
|
+
* @error mention-feed-callback-error
|
|
776
|
+
*/ logWarning('mention-feed-callback-error', {
|
|
696
777
|
marker
|
|
697
778
|
});
|
|
698
779
|
});
|
|
699
780
|
}
|
|
700
781
|
/**
|
|
701
|
-
|
|
702
|
-
|
|
782
|
+
* Registers a text watcher for the marker.
|
|
783
|
+
*/ _setupTextWatcher(feeds) {
|
|
703
784
|
const editor = this.editor;
|
|
704
785
|
const feedsWithPattern = feeds.map((feed)=>({
|
|
705
786
|
...feed,
|
|
@@ -756,8 +837,8 @@ class MentionUI extends Plugin {
|
|
|
756
837
|
return watcher;
|
|
757
838
|
}
|
|
758
839
|
/**
|
|
759
|
-
|
|
760
|
-
|
|
840
|
+
* Handles the feed response event data.
|
|
841
|
+
*/ _handleFeedResponse(data) {
|
|
761
842
|
const { feed, marker } = data;
|
|
762
843
|
// eslint-disable-next-line max-len
|
|
763
844
|
// @if CK_DEBUG_MENTION // console.log( `%c[Feed]%c Response for "${ data.feedText }" (${ feed.length })`, 'color: blue', 'color: black', feed );
|
|
@@ -786,8 +867,8 @@ class MentionUI extends Plugin {
|
|
|
786
867
|
}
|
|
787
868
|
}
|
|
788
869
|
/**
|
|
789
|
-
|
|
790
|
-
|
|
870
|
+
* Shows the mentions balloon. If the panel is already visible, it will reposition it.
|
|
871
|
+
*/ _showOrUpdateUI(markerMarker) {
|
|
791
872
|
if (this._isUIVisible) {
|
|
792
873
|
// @if CK_DEBUG_MENTION // console.log( '%c[UI]%c Updating position.', 'color: green', 'color: black' );
|
|
793
874
|
// Update balloon position as the mention list view may change its size.
|
|
@@ -804,8 +885,8 @@ class MentionUI extends Plugin {
|
|
|
804
885
|
this._mentionsView.selectFirst();
|
|
805
886
|
}
|
|
806
887
|
/**
|
|
807
|
-
|
|
808
|
-
|
|
888
|
+
* Hides the mentions balloon and removes the 'mention' marker from the markers collection.
|
|
889
|
+
*/ _hideUIAndRemoveMarker() {
|
|
809
890
|
// Remove the mention view from balloon before removing marker - it is used by balloon position target().
|
|
810
891
|
if (this._balloon.hasView(this._mentionsView)) {
|
|
811
892
|
// @if CK_DEBUG_MENTION // console.log( '%c[UI]%c Hiding the UI.', 'color: green', 'color: black' );
|
|
@@ -820,8 +901,8 @@ class MentionUI extends Plugin {
|
|
|
820
901
|
this._mentionsView.position = undefined;
|
|
821
902
|
}
|
|
822
903
|
/**
|
|
823
|
-
|
|
824
|
-
|
|
904
|
+
* Renders a single item in the autocomplete list.
|
|
905
|
+
*/ _renderItem(item, marker) {
|
|
825
906
|
const editor = this.editor;
|
|
826
907
|
let view;
|
|
827
908
|
let label = item.id;
|
|
@@ -843,11 +924,11 @@ class MentionUI extends Plugin {
|
|
|
843
924
|
return view;
|
|
844
925
|
}
|
|
845
926
|
/**
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
927
|
+
* Creates a position options object used to position the balloon panel.
|
|
928
|
+
*
|
|
929
|
+
* @param mentionMarker
|
|
930
|
+
* @param preferredPosition The name of the last matched position name.
|
|
931
|
+
*/ _getBalloonPanelPositionData(mentionMarker, preferredPosition) {
|
|
851
932
|
const editor = this.editor;
|
|
852
933
|
const editing = editor.editing;
|
|
853
934
|
const domConverter = editing.view.domConverter;
|
|
@@ -877,18 +958,6 @@ class MentionUI extends Plugin {
|
|
|
877
958
|
positions: getBalloonPanelPositions(preferredPosition, uiLanguageDirection)
|
|
878
959
|
};
|
|
879
960
|
}
|
|
880
|
-
/**
|
|
881
|
-
* @inheritDoc
|
|
882
|
-
*/ constructor(editor){
|
|
883
|
-
super(editor);
|
|
884
|
-
this._items = new Collection();
|
|
885
|
-
this._mentionsView = this._createMentionView();
|
|
886
|
-
this._mentionsConfigurations = new Map();
|
|
887
|
-
this._requestFeedDebounced = debounce(this._requestFeed, 100);
|
|
888
|
-
editor.config.define('mention', {
|
|
889
|
-
feeds: []
|
|
890
|
-
});
|
|
891
|
-
}
|
|
892
961
|
}
|
|
893
962
|
/**
|
|
894
963
|
* Returns the balloon positions data callbacks.
|
|
@@ -1085,18 +1154,22 @@ class MentionUI extends Plugin {
|
|
|
1085
1154
|
return editor.model.markers.has('mention');
|
|
1086
1155
|
}
|
|
1087
1156
|
|
|
1088
|
-
|
|
1157
|
+
/**
|
|
1158
|
+
* The mention plugin.
|
|
1159
|
+
*
|
|
1160
|
+
* For a detailed overview, check the {@glink features/mentions Mention feature} guide.
|
|
1161
|
+
*/ class Mention extends Plugin {
|
|
1089
1162
|
toMentionAttribute(viewElement, data) {
|
|
1090
1163
|
return _toMentionAttribute(viewElement, data);
|
|
1091
1164
|
}
|
|
1092
1165
|
/**
|
|
1093
|
-
|
|
1094
|
-
|
|
1166
|
+
* @inheritDoc
|
|
1167
|
+
*/ static get pluginName() {
|
|
1095
1168
|
return 'Mention';
|
|
1096
1169
|
}
|
|
1097
1170
|
/**
|
|
1098
|
-
|
|
1099
|
-
|
|
1171
|
+
* @inheritDoc
|
|
1172
|
+
*/ static get requires() {
|
|
1100
1173
|
return [
|
|
1101
1174
|
MentionEditing,
|
|
1102
1175
|
MentionUI
|