refactor: move textcomplete to core

This commit is contained in:
Barış Soner Uşaklı
2024-09-13 12:43:40 -04:00
parent da7044e4f4
commit 20fd75bf76
4 changed files with 47 additions and 8 deletions

View File

@@ -35,6 +35,9 @@
"@isaacs/ttlcache": "1.4.1", "@isaacs/ttlcache": "1.4.1",
"@nodebb/spider-detector": "2.0.3", "@nodebb/spider-detector": "2.0.3",
"@popperjs/core": "2.11.8", "@popperjs/core": "2.11.8",
"@textcomplete/contenteditable": "0.1.13",
"@textcomplete/core": "0.1.13",
"@textcomplete/textarea": "0.1.13",
"ace-builds": "1.36.2", "ace-builds": "1.36.2",
"archiver": "7.0.1", "archiver": "7.0.1",
"async": "3.2.6", "async": "3.2.6",

View File

@@ -11,7 +11,7 @@ define('forum/chats', [
'forum/chats/user-list', 'forum/chats/user-list',
'forum/chats/message-search', 'forum/chats/message-search',
'forum/chats/pinned-messages', 'forum/chats/pinned-messages',
'composer/autocomplete', 'autocomplete',
'hooks', 'hooks',
'bootbox', 'bootbox',
'alerts', 'alerts',

View File

@@ -1,6 +1,8 @@
'use strict'; 'use strict';
define('autocomplete', ['api', 'alerts'], function (api, alerts) { define('autocomplete', [
'api', 'alerts', '@textcomplete/core', '@textcomplete/textarea', '@textcomplete/contenteditable',
], function (api, alerts, { Textcomplete }, { TextareaEditor }, { ContenteditableEditor }) {
const autocomplete = {}; const autocomplete = {};
const _default = { const _default = {
delay: 200, delay: 200,
@@ -129,5 +131,37 @@ define('autocomplete', ['api', 'alerts'], function (api, alerts) {
onselect(event, ui); onselect(event, ui);
} }
// This is a generic method that is also used by the chat
autocomplete.setup = function ({ element, strategies, options }) {
const targetEl = element.get(0);
if (!targetEl) {
return;
}
var editor;
if (targetEl.nodeName === 'TEXTAREA' || targetEl.nodeName === 'INPUT') {
editor = new TextareaEditor(targetEl);
} else if (targetEl.nodeName === 'DIV' && targetEl.getAttribute('contenteditable') === 'true') {
editor = new ContenteditableEditor(targetEl);
}
if (!editor) {
throw new Error('unknown target element type');
}
// yuku-t/textcomplete inherits directionality from target element itself
targetEl.setAttribute('dir', document.querySelector('html').getAttribute('data-dir'));
var textcomplete = new Textcomplete(editor, strategies, {
dropdown: options,
});
textcomplete.on('rendered', function () {
if (textcomplete.dropdown.items.length) {
// Activate the first item by default.
textcomplete.dropdown.items[0].activate();
}
});
return textcomplete;
};
return autocomplete; return autocomplete;
}); });

View File

@@ -1,13 +1,15 @@
'use strict'; 'use strict';
define('quickreply', [ define('quickreply', [
'components', 'composer/autocomplete', 'api', 'components', 'autocomplete', 'api',
'alerts', 'uploadHelpers', 'mousetrap', 'storage', 'hooks', 'alerts', 'uploadHelpers', 'mousetrap', 'storage', 'hooks',
], function ( ], function (
components, autocomplete, api, components, autocomplete, api,
alerts, uploadHelpers, mousetrap, storage, hooks alerts, uploadHelpers, mousetrap, storage, hooks
) { ) {
const QuickReply = {}; const QuickReply = {
_active: {},
};
QuickReply.init = function () { QuickReply.init = function () {
const element = components.get('topic/quickreply/text'); const element = components.get('topic/quickreply/text');
@@ -27,7 +29,7 @@ define('quickreply', [
destroyAutoComplete(); destroyAutoComplete();
}); });
$(window).trigger('composer:autocomplete:init', data); $(window).trigger('composer:autocomplete:init', data);
autocomplete._active.core_qr = autocomplete.setup(data); QuickReply._active.core_qr = autocomplete.setup(data);
mousetrap.bind('ctrl+return', (e) => { mousetrap.bind('ctrl+return', (e) => {
if (e.target === element.get(0)) { if (e.target === element.get(0)) {
@@ -123,9 +125,9 @@ define('quickreply', [
}; };
function destroyAutoComplete() { function destroyAutoComplete() {
if (autocomplete._active.core_qr) { if (QuickReply._active.core_qr) {
autocomplete._active.core_qr.destroy(); QuickReply._active.core_qr.destroy();
autocomplete._active.core_qr = null; QuickReply._active.core_qr = null;
} }
} }