fix topic bar to allow prefixes (#7325)
* - do not select if escape is pressed - allow prefixes by adding current request content to result list - remove html-tags before insert on page fix #7126 Signed-off-by: Michael Gnehr <michael@gnehr.de> * sort current query to top Signed-off-by: Michael Gnehr <michael@gnehr.de> * remove already added topics from dropdown list Signed-off-by: Michael Gnehr <michael@gnehr.de> * protoct against xss thanks to @silverwind Signed-off-by: Michael Gnehr <michael@gnehr.de>
This commit is contained in:
parent
ff85dd3e12
commit
8ab2d31bfe
1 changed files with 37 additions and 4 deletions
|
@ -2847,6 +2847,7 @@ function initTopicbar() {
|
||||||
|
|
||||||
topicDropdown.dropdown({
|
topicDropdown.dropdown({
|
||||||
allowAdditions: true,
|
allowAdditions: true,
|
||||||
|
forceSelection: false,
|
||||||
fields: { name: "description", value: "data-value" },
|
fields: { name: "description", value: "data-value" },
|
||||||
saveRemoteData: false,
|
saveRemoteData: false,
|
||||||
label: {
|
label: {
|
||||||
|
@ -2864,18 +2865,50 @@ function initTopicbar() {
|
||||||
throttle: 500,
|
throttle: 500,
|
||||||
cache: false,
|
cache: false,
|
||||||
onResponse: function(res) {
|
onResponse: function(res) {
|
||||||
var formattedResponse = {
|
let formattedResponse = {
|
||||||
success: false,
|
success: false,
|
||||||
results: [],
|
results: [],
|
||||||
};
|
};
|
||||||
|
const stripTags = function (text) {
|
||||||
|
return text.replace(/<[^>]*>?/gm, "");
|
||||||
|
};
|
||||||
|
|
||||||
|
let query = stripTags(this.urlData.query.trim());
|
||||||
|
let found_query = false;
|
||||||
|
let current_topics = [];
|
||||||
|
topicDropdown.find('div.label.visible.topic,a.label.visible').each(function(_,e){ current_topics.push(e.dataset.value); });
|
||||||
|
|
||||||
if (res.topics) {
|
if (res.topics) {
|
||||||
formattedResponse.success = true;
|
let found = false;
|
||||||
for (var i=0;i < res.topics.length;i++) {
|
for (let i=0;i < res.topics.length;i++) {
|
||||||
formattedResponse.results.push({"description": res.topics[i].Name, "data-value": res.topics[i].Name})
|
// skip currently added tags
|
||||||
|
if (current_topics.indexOf(res.topics[i].Name) != -1){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (res.topics[i].Name.toLowerCase() === query.toLowerCase()){
|
||||||
|
found_query = true;
|
||||||
|
}
|
||||||
|
formattedResponse.results.push({"description": res.topics[i].Name, "data-value": res.topics[i].Name});
|
||||||
|
found = true;
|
||||||
}
|
}
|
||||||
|
formattedResponse.success = found;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (query.length > 0 && !found_query){
|
||||||
|
formattedResponse.success = true;
|
||||||
|
formattedResponse.results.unshift({"description": query, "data-value": query});
|
||||||
|
} else if (query.length > 0 && found_query) {
|
||||||
|
formattedResponse.results.sort(function(a, b){
|
||||||
|
if (a.description.toLowerCase() === query.toLowerCase()) return -1;
|
||||||
|
if (b.description.toLowerCase() === query.toLowerCase()) return 1;
|
||||||
|
if (a.description > b.description) return -1;
|
||||||
|
if (a.description < b.description) return 1;
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return formattedResponse;
|
return formattedResponse;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
Reference in a new issue