You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
191 lines
8.3 KiB
191 lines
8.3 KiB
/** @odoo-module **/
|
|
import { registerInstancePatchModel } from '@mail/model/model_core';
|
|
import { ComposerTextInput } from '@mail/components/composer_text_input/composer_text_input';
|
|
import rpc from 'web.rpc';
|
|
import {patch} from 'web.utils';
|
|
/* Add new functionality on keyup of textarea */
|
|
patch(ComposerTextInput.prototype, "my patch", {
|
|
_onKeydownTextarea(ev){
|
|
let autoCompleteTextAreaEl = this.el.querySelector('#autoCompleteText');
|
|
let userTextAreaEl = this.el.querySelector('#userInputText');
|
|
var UserInput = userTextAreaEl.value;
|
|
rpc.query({
|
|
model: 'mail.message',
|
|
method: 'get_message',
|
|
}).then(function (data) {
|
|
if (UserInput !== '/') {
|
|
/*Matching sentences or words are taken from the list */
|
|
UserInput = UserInput.replace(new RegExp("\\\\", "g"), "\\\\");
|
|
const matcher = new RegExp(`^${UserInput}`, 'g');
|
|
var filter_list = data.filter(word => word.match(matcher));
|
|
filter_list.sort();
|
|
if (filter_list[0] == null) {
|
|
autoCompleteTextAreaEl.value = ' ';
|
|
}
|
|
else {
|
|
autoCompleteTextAreaEl.value = filter_list[0];
|
|
}
|
|
if (UserInput == '') {
|
|
autoCompleteTextAreaEl.value = " ";
|
|
}
|
|
switch (ev.key) {
|
|
case 'Tab':
|
|
userTextAreaEl.value = filter_list[0];
|
|
autoCompleteTextAreaEl.value = ' ';
|
|
case ' ':
|
|
autoCompleteTextAreaEl.value = ' ';
|
|
case 'Enter':
|
|
autoCompleteTextAreaEl.value = ' ';
|
|
}
|
|
}
|
|
})
|
|
if (!this.composerView) {
|
|
return;
|
|
}
|
|
switch (ev.key) {
|
|
case 'Escape':
|
|
if (this.composerView.hasSuggestions) {
|
|
ev.preventDefault();
|
|
this.composerView.closeSuggestions();
|
|
markEventHandled(ev, 'ComposerTextInput.closeSuggestions');
|
|
}
|
|
break;
|
|
// UP, DOWN, TAB: Prevent moving cursor if navigation in mention suggestions
|
|
case 'ArrowUp':
|
|
case 'PageUp':
|
|
case 'ArrowDown':
|
|
case 'PageDown':
|
|
case 'Home':
|
|
case 'End':
|
|
case 'Tab':
|
|
if (this.composerView.hasSuggestions) {
|
|
// We use preventDefault here to avoid keys native actions but actions are handled in keyUp
|
|
ev.preventDefault();
|
|
}
|
|
break;
|
|
// ENTER: Submit the message only if the dropdown mention proposition is not displayed
|
|
case 'Enter':
|
|
this._onKeydownTextareaEnter(ev);
|
|
break;
|
|
}
|
|
},
|
|
_onKeyupTextarea(ev){
|
|
let autoCompleteTextAreaEl = this.el.querySelector('#autoCompleteText');
|
|
let userTextAreaEl = this.el.querySelector('#userInputText');
|
|
var UserInput = userTextAreaEl.value;
|
|
rpc.query({
|
|
model: 'mail.message',
|
|
method: 'get_message',
|
|
}).then(function (data) {
|
|
if (UserInput !== '/') {
|
|
/*Matching sentences or words are taken from the list */
|
|
UserInput = UserInput.replace(new RegExp("\\\\", "g"), "\\\\");
|
|
const matcher = new RegExp(`^${UserInput}`, 'g');
|
|
var filter_list = data.filter(word => word.match(matcher));
|
|
filter_list.sort();
|
|
if (filter_list[0] == null) {
|
|
autoCompleteTextAreaEl.value = ' ';
|
|
}
|
|
else {
|
|
autoCompleteTextAreaEl.value = filter_list[0];
|
|
}
|
|
if (UserInput == '') {
|
|
autoCompleteTextAreaEl.value = " ";
|
|
}
|
|
switch (ev.key) {
|
|
case 'ArrowRight':
|
|
userTextAreaEl.value = filter_list[0];
|
|
autoCompleteTextAreaEl.value = ' ';
|
|
case ' ':
|
|
autoCompleteTextAreaEl.value = ' ';
|
|
case 'Enter':
|
|
autoCompleteTextAreaEl.value = ' ';
|
|
}
|
|
}
|
|
})
|
|
if (!this.composerView) {
|
|
return;
|
|
}
|
|
switch (ev.key) {
|
|
case 'Escape':
|
|
// Already handled in _onKeydownTextarea, break to avoid default
|
|
break;
|
|
// ENTER, HOME, END, UP, DOWN, PAGE UP, PAGE DOWN, TAB: check if navigation in mention suggestions
|
|
case 'Enter':
|
|
if (this.composerView.hasSuggestions) {
|
|
this.composerView.insertSuggestion();
|
|
this.composerView.closeSuggestions();
|
|
this.composerView.update({ doFocus: true });
|
|
}
|
|
break;
|
|
case 'ArrowUp':
|
|
case 'PageUp':
|
|
if (ev.key === 'ArrowUp' && !this.composerView.hasSuggestions &&
|
|
!this.composerView.composer.textInputContent &&
|
|
this.composerView.threadView) {
|
|
this.composerView.threadView.startEditingLastMessageFromCurrentUser();
|
|
break;
|
|
}
|
|
if (this.composerView.hasSuggestions) {
|
|
this.composerView.setPreviousSuggestionActive();
|
|
this.composerView.update({ hasToScrollToActiveSuggestion: true });
|
|
}
|
|
break;
|
|
case 'ArrowDown':
|
|
case 'PageDown':
|
|
if (ev.key === 'ArrowDown' && !this.composerView.hasSuggestions
|
|
&& !this.composerView.composer.textInputContent &&
|
|
this.composerView.threadView) {
|
|
this.composerView.threadView.startEditingLastMessageFromCurrentUser();
|
|
break;
|
|
}
|
|
if (this.composerView.hasSuggestions) {
|
|
this.composerView.setNextSuggestionActive();
|
|
this.composerView.update({ hasToScrollToActiveSuggestion: true });
|
|
}
|
|
break;
|
|
case 'Home':
|
|
if (this.composerView.hasSuggestions) {
|
|
this.composerView.setFirstSuggestionActive();
|
|
this.composerView.update({ hasToScrollToActiveSuggestion: true });
|
|
}
|
|
break;
|
|
case 'End':
|
|
if (this.composerView.hasSuggestions) {
|
|
this.composerView.setLastSuggestionActive();
|
|
this.composerView.update({ hasToScrollToActiveSuggestion: true });
|
|
}
|
|
break;
|
|
case 'Tab':
|
|
if (this.composerView.hasSuggestions) {
|
|
if (ev.shiftKey) {
|
|
this.composerView.setPreviousSuggestionActive();
|
|
this.composerView.update({ hasToScrollToActiveSuggestion: true });
|
|
} else {
|
|
this.composerView.setNextSuggestionActive();
|
|
this.composerView.update({ hasToScrollToActiveSuggestion: true });
|
|
}
|
|
}
|
|
break;
|
|
case 'Alt':
|
|
case 'AltGraph':
|
|
case 'CapsLock':
|
|
case 'Control':
|
|
case 'Fn':
|
|
case 'FnLock':
|
|
case 'Hyper':
|
|
case 'Meta':
|
|
case 'NumLock':
|
|
case 'ScrollLock':
|
|
case 'Shift':
|
|
case 'ShiftSuper':
|
|
case 'Symbol':
|
|
case 'SymbolLock':
|
|
// Prevent modifier keys from resetting the suggestion state
|
|
break;
|
|
// Otherwise, check if a mention is typed
|
|
default:
|
|
this.saveStateInStore();
|
|
}
|
|
},
|
|
});
|