Merge pull request #3215 from evazion/fix-ss-autocomplete
Fix #3214: Add autocomplete for saved searches.
This commit is contained in:
@@ -93,7 +93,7 @@
|
|||||||
var prefixes = "-|~|general:|gen:|artist:|art:|copyright:|copy:|co:|character:|char:|ch:";
|
var prefixes = "-|~|general:|gen:|artist:|art:|copyright:|copy:|co:|character:|char:|ch:";
|
||||||
var metatags = "order|-status|status|-rating|rating|-locked|locked|child|filetype|-filetype|" +
|
var metatags = "order|-status|status|-rating|rating|-locked|locked|child|filetype|-filetype|" +
|
||||||
"-user|user|-approver|approver|commenter|comm|noter|noteupdater|artcomm|-fav|fav|ordfav|" +
|
"-user|user|-approver|approver|commenter|comm|noter|noteupdater|artcomm|-fav|fav|ordfav|" +
|
||||||
"sub|-pool|pool|ordpool|favgroup";
|
"sub|-pool|pool|ordpool|favgroup|-search|search";
|
||||||
|
|
||||||
$fields_multiple.autocomplete({
|
$fields_multiple.autocomplete({
|
||||||
delay: 100,
|
delay: 100,
|
||||||
@@ -183,6 +183,10 @@
|
|||||||
case "-favgroup":
|
case "-favgroup":
|
||||||
Danbooru.Autocomplete.favorite_group_source(term, resp, metatag);
|
Danbooru.Autocomplete.favorite_group_source(term, resp, metatag);
|
||||||
break;
|
break;
|
||||||
|
case "search":
|
||||||
|
case "-search":
|
||||||
|
Danbooru.Autocomplete.saved_search_source(term, resp);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
Danbooru.Autocomplete.normal_source(term, resp);
|
Danbooru.Autocomplete.normal_source(term, resp);
|
||||||
break;
|
break;
|
||||||
@@ -420,6 +424,17 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Danbooru.Autocomplete.saved_search_source = function(term, resp) {
|
||||||
|
return Danbooru.SavedSearch.labels(term).success(function(labels) {
|
||||||
|
resp(labels.map(function(label) {
|
||||||
|
return {
|
||||||
|
label: label.replace(/_/g, " "),
|
||||||
|
value: "search:" + label,
|
||||||
|
};
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
}
|
||||||
})();
|
})();
|
||||||
|
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
|
|||||||
@@ -548,23 +548,15 @@
|
|||||||
|
|
||||||
Danbooru.Post.initialize_saved_searches = function() {
|
Danbooru.Post.initialize_saved_searches = function() {
|
||||||
$("#saved_search_labels").autocomplete({
|
$("#saved_search_labels").autocomplete({
|
||||||
minLength: 2,
|
|
||||||
source: function(req, resp) {
|
source: function(req, resp) {
|
||||||
$.ajax({
|
Danbooru.SavedSearch.labels(req.term).success(function(labels) {
|
||||||
url: "/saved_searches/labels.json",
|
resp(labels.map(function(label) {
|
||||||
data: {
|
return {
|
||||||
label: req.term
|
label: label.replace(/_/g, " "),
|
||||||
},
|
value: label
|
||||||
method: "get",
|
};
|
||||||
success: function(data) {
|
}));
|
||||||
resp($.map(data, function(saved_search) {
|
});
|
||||||
return {
|
|
||||||
label: saved_search.replace(/_/g, " "),
|
|
||||||
value: saved_search
|
|
||||||
};
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,16 @@
|
|||||||
$(document).ready(function() {
|
Danbooru.SavedSearch = {};
|
||||||
if ($("#c-saved-searches".length)) {
|
|
||||||
|
Danbooru.SavedSearch.initialize_all = function() {
|
||||||
|
if ($("#c-saved-searches").length) {
|
||||||
Danbooru.sorttable($("#c-saved-searches table"));
|
Danbooru.sorttable($("#c-saved-searches table"));
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
|
||||||
|
Danbooru.SavedSearch.labels = function(term) {
|
||||||
|
return $.getJSON("/saved_searches/labels", {
|
||||||
|
"search[label]": term + "*",
|
||||||
|
"limit": 10
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
$(Danbooru.SavedSearch.initialize_all);
|
||||||
|
|||||||
@@ -17,11 +17,7 @@ class SavedSearchesController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def labels
|
def labels
|
||||||
@labels = SavedSearch.labels_for(CurrentUser.user.id)
|
@labels = SavedSearch.search_labels(CurrentUser.id, params[:search])
|
||||||
if params[:label]
|
|
||||||
regexp = Regexp.compile(Regexp.escape(params[:label]))
|
|
||||||
@labels = @labels.grep(regexp)
|
|
||||||
end
|
|
||||||
respond_with(@labels)
|
respond_with(@labels)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -62,6 +62,19 @@ class SavedSearch < ApplicationRecord
|
|||||||
label.to_s.strip.downcase.gsub(/[[:space:]]/, "_")
|
label.to_s.strip.downcase.gsub(/[[:space:]]/, "_")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.search_labels(user_id, params)
|
||||||
|
labels = labels_for(user_id)
|
||||||
|
|
||||||
|
if params[:label].present?
|
||||||
|
query = Regexp.escape(params[:label]).gsub("\\*", ".*")
|
||||||
|
query = ".*#{query}.*" unless query.include?("*")
|
||||||
|
query = /\A#{query}\z/
|
||||||
|
labels = labels.grep(query)
|
||||||
|
end
|
||||||
|
|
||||||
|
labels
|
||||||
|
end
|
||||||
|
|
||||||
def self.labels_for(user_id)
|
def self.labels_for(user_id)
|
||||||
Cache.get(cache_key(user_id)) do
|
Cache.get(cache_key(user_id)) do
|
||||||
SavedSearch.where(user_id: user_id).order("label").pluck("distinct unnest(labels) as label")
|
SavedSearch.where(user_id: user_id).order("label").pluck("distinct unnest(labels) as label")
|
||||||
|
|||||||
Reference in New Issue
Block a user