blob: 41e917d2ac4d82512b4c0bdf0602f9c71dd20f38 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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
97
98
99
100
101
102
103
104
105
106
107
|
odoo.define('mail/static/src/models/canned_response/canned_response.js', function (require) {
'use strict';
const { registerNewModel } = require('mail/static/src/model/model_core.js');
const { attr } = require('mail/static/src/model/model_field.js');
const { cleanSearchTerm } = require('mail/static/src/utils/utils.js');
function factory(dependencies) {
class CannedResponse extends dependencies['mail.model'] {
/**
* Fetches canned responses matching the given search term to extend the
* JS knowledge and to update the suggestion list accordingly.
*
* In practice all canned responses are already fetched at init so this
* method does nothing.
*
* @static
* @param {string} searchTerm
* @param {Object} [options={}]
* @param {mail.thread} [options.thread] prioritize and/or restrict
* result in the context of given thread
*/
static fetchSuggestions(searchTerm, { thread } = {}) {}
/**
* Returns a sort function to determine the order of display of canned
* responses in the suggestion list.
*
* @static
* @param {string} searchTerm
* @param {Object} [options={}]
* @param {mail.thread} [options.thread] prioritize result in the
* context of given thread
* @returns {function}
*/
static getSuggestionSortFunction(searchTerm, { thread } = {}) {
const cleanedSearchTerm = cleanSearchTerm(searchTerm);
return (a, b) => {
const cleanedAName = cleanSearchTerm(a.source || '');
const cleanedBName = cleanSearchTerm(b.source || '');
if (cleanedAName.startsWith(cleanedSearchTerm) && !cleanedBName.startsWith(cleanedSearchTerm)) {
return -1;
}
if (!cleanedAName.startsWith(cleanedSearchTerm) && cleanedBName.startsWith(cleanedSearchTerm)) {
return 1;
}
if (cleanedAName < cleanedBName) {
return -1;
}
if (cleanedAName > cleanedBName) {
return 1;
}
return a.id - b.id;
};
}
/*
* Returns canned responses that match the given search term.
*
* @static
* @param {string} searchTerm
* @param {Object} [options={}]
* @param {mail.thread} [options.thread] prioritize and/or restrict
* result in the context of given thread
* @returns {[mail.canned_response[], mail.canned_response[]]}
*/
static searchSuggestions(searchTerm, { thread } = {}) {
const cleanedSearchTerm = cleanSearchTerm(searchTerm);
return [this.env.messaging.cannedResponses.filter(cannedResponse =>
cleanSearchTerm(cannedResponse.source).includes(cleanedSearchTerm)
)];
}
/**
* Returns the text that identifies this canned response in a mention.
*
* @returns {string}
*/
getMentionText() {
return this.substitution;
}
}
CannedResponse.fields = {
id: attr(),
/**
* The keyword to use a specific canned response.
*/
source: attr(),
/**
* The canned response itself which will replace the keyword previously
* entered.
*/
substitution: attr(),
};
CannedResponse.modelName = 'mail.canned_response';
return CannedResponse;
}
registerNewModel('mail.canned_response', factory);
});
|