Fix stored css bug in all typeahead functions (update typeahead -> bugfix typeahead)
This commit is contained in:
parent
cd53d57516
commit
bad4c01474
|
@ -737,6 +737,7 @@ class CalibreDB():
|
||||||
self.session.connection().connection.connection.create_function("lower", 1, lcase)
|
self.session.connection().connection.connection.create_function("lower", 1, lcase)
|
||||||
entries = self.session.query(database).filter(tag_filter). \
|
entries = self.session.query(database).filter(tag_filter). \
|
||||||
filter(func.lower(database.name).ilike("%" + query + "%")).all()
|
filter(func.lower(database.name).ilike("%" + query + "%")).all()
|
||||||
|
# json_dumps = json.dumps([dict(name=escape(r.name.replace(*replace))) for r in entries])
|
||||||
json_dumps = json.dumps([dict(name=r.name.replace(*replace)) for r in entries])
|
json_dumps = json.dumps([dict(name=r.name.replace(*replace)) for r in entries])
|
||||||
return json_dumps
|
return json_dumps
|
||||||
|
|
||||||
|
|
10
cps/static/css/libs/typeahead.css
vendored
10
cps/static/css/libs/typeahead.css
vendored
|
@ -145,7 +145,7 @@ fieldset[disabled] .twitter-typeahead .tt-input {
|
||||||
cursor: not-allowed;
|
cursor: not-allowed;
|
||||||
background-color: #eeeeee !important;
|
background-color: #eeeeee !important;
|
||||||
}
|
}
|
||||||
.tt-dropdown-menu {
|
.tt-menu {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 100%;
|
top: 100%;
|
||||||
left: 0;
|
left: 0;
|
||||||
|
@ -166,7 +166,7 @@ fieldset[disabled] .twitter-typeahead .tt-input {
|
||||||
*border-right-width: 2px;
|
*border-right-width: 2px;
|
||||||
*border-bottom-width: 2px;
|
*border-bottom-width: 2px;
|
||||||
}
|
}
|
||||||
.tt-dropdown-menu .tt-suggestion {
|
.tt-menu .tt-suggestion {
|
||||||
display: block;
|
display: block;
|
||||||
padding: 3px 20px;
|
padding: 3px 20px;
|
||||||
clear: both;
|
clear: both;
|
||||||
|
@ -175,15 +175,15 @@ fieldset[disabled] .twitter-typeahead .tt-input {
|
||||||
color: #333333;
|
color: #333333;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
.tt-dropdown-menu .tt-suggestion.tt-cursor {
|
.tt-menu .tt-suggestion.tt-cursor {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
outline: 0;
|
outline: 0;
|
||||||
background-color: #f5f5f5;
|
background-color: #f5f5f5;
|
||||||
color: #262626;
|
color: #262626;
|
||||||
}
|
}
|
||||||
.tt-dropdown-menu .tt-suggestion.tt-cursor a {
|
.tt-menu .tt-suggestion.tt-cursor a {
|
||||||
color: #262626;
|
color: #262626;
|
||||||
}
|
}
|
||||||
.tt-dropdown-menu .tt-suggestion p {
|
.tt-menu .tt-suggestion p {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,90 +46,20 @@ $(".datepicker_delete").click(function() {
|
||||||
Takes a prefix, query typeahead callback, Bloodhound typeahead adapter
|
Takes a prefix, query typeahead callback, Bloodhound typeahead adapter
|
||||||
and returns the completions it gets from the bloodhound engine prefixed.
|
and returns the completions it gets from the bloodhound engine prefixed.
|
||||||
*/
|
*/
|
||||||
function prefixedSource(prefix, query, cb, bhAdapter) {
|
function prefixedSource(prefix, query, cb, source) {
|
||||||
bhAdapter(query, function(retArray) {
|
function async(retArray) {
|
||||||
|
retArray = retArray || [];
|
||||||
var matches = [];
|
var matches = [];
|
||||||
for (var i = 0; i < retArray.length; i++) {
|
for (var i = 0; i < retArray.length; i++) {
|
||||||
var obj = {name : prefix + retArray[i].name};
|
var obj = {name : prefix + retArray[i].name};
|
||||||
matches.push(obj);
|
matches.push(obj);
|
||||||
}
|
}
|
||||||
cb(matches);
|
cb(matches);
|
||||||
});
|
}
|
||||||
|
source.search(query, cb, async);
|
||||||
}
|
}
|
||||||
|
|
||||||
var authors = new Bloodhound({
|
|
||||||
name: "authors",
|
|
||||||
datumTokenizer: function datumTokenizer(datum) {
|
|
||||||
return [datum.name];
|
|
||||||
},
|
|
||||||
queryTokenizer: Bloodhound.tokenizers.whitespace,
|
|
||||||
remote: {
|
|
||||||
url: getPath() + "/get_authors_json?q=%QUERY"
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var series = new Bloodhound({
|
|
||||||
name: "series",
|
|
||||||
datumTokenizer: function datumTokenizer(datum) {
|
|
||||||
return [datum.name];
|
|
||||||
},
|
|
||||||
queryTokenizer: function queryTokenizer(query) {
|
|
||||||
return [query];
|
|
||||||
},
|
|
||||||
remote: {
|
|
||||||
url: getPath() + "/get_series_json?q=",
|
|
||||||
replace: function replace(url, query) {
|
|
||||||
return url + encodeURIComponent(query);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
var tags = new Bloodhound({
|
|
||||||
name: "tags",
|
|
||||||
datumTokenizer: function datumTokenizer(datum) {
|
|
||||||
return [datum.name];
|
|
||||||
},
|
|
||||||
queryTokenizer: function queryTokenizer(query) {
|
|
||||||
var tokens = query.split(",");
|
|
||||||
tokens = [tokens[tokens.length - 1].trim()];
|
|
||||||
return tokens;
|
|
||||||
},
|
|
||||||
remote: {
|
|
||||||
url: getPath() + "/get_tags_json?q=%QUERY"
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var languages = new Bloodhound({
|
|
||||||
name: "languages",
|
|
||||||
datumTokenizer: function datumTokenizer(datum) {
|
|
||||||
return [datum.name];
|
|
||||||
},
|
|
||||||
queryTokenizer: function queryTokenizer(query) {
|
|
||||||
return [query];
|
|
||||||
},
|
|
||||||
remote: {
|
|
||||||
url: getPath() + "/get_languages_json?q=",
|
|
||||||
replace: function replace(url, query) {
|
|
||||||
return url + encodeURIComponent(query);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var publishers = new Bloodhound({
|
|
||||||
name: "publisher",
|
|
||||||
datumTokenizer: function datumTokenizer(datum) {
|
|
||||||
return [datum.name];
|
|
||||||
},
|
|
||||||
queryTokenizer: Bloodhound.tokenizers.whitespace,
|
|
||||||
remote: {
|
|
||||||
url: getPath() + "/get_publishers_json?q=%QUERY"
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
function sourceSplit(query, cb, split, source) {
|
function sourceSplit(query, cb, split, source) {
|
||||||
var bhAdapter = source.ttAdapter();
|
|
||||||
|
|
||||||
var tokens = query.split(split);
|
var tokens = query.split(split);
|
||||||
var currentSource = tokens[tokens.length - 1].trim();
|
var currentSource = tokens[tokens.length - 1].trim();
|
||||||
|
|
||||||
|
@ -144,84 +74,148 @@ function sourceSplit(query, cb, split, source) {
|
||||||
for (var i = 0; i < tokens.length; i++) {
|
for (var i = 0; i < tokens.length; i++) {
|
||||||
prefix += tokens[i].trim() + newSplit;
|
prefix += tokens[i].trim() + newSplit;
|
||||||
}
|
}
|
||||||
prefixedSource(prefix, currentSource, cb, bhAdapter);
|
prefixedSource(prefix, currentSource, cb, source);
|
||||||
}
|
}
|
||||||
|
|
||||||
var promiseAuthors = authors.initialize();
|
var authors = new Bloodhound({
|
||||||
promiseAuthors.done(function() {
|
name: "authors",
|
||||||
$("#bookAuthor").typeahead(
|
identify: function(obj) { return obj.name; },
|
||||||
{
|
datumTokenizer: function datumTokenizer(datum) {
|
||||||
highlight: true, minLength: 1,
|
return [datum.name];
|
||||||
hint: true
|
},
|
||||||
}, {
|
queryTokenizer: Bloodhound.tokenizers.whitespace,
|
||||||
name: "authors",
|
remote: {
|
||||||
displayKey: "name",
|
url: getPath() + "/get_authors_json?q=%QUERY",
|
||||||
source: function source(query, cb) {
|
wildcard: '%QUERY',
|
||||||
return sourceSplit(query, cb, "&", authors); //sourceSplit //("&")
|
},
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
var promiseSeries = series.initialize();
|
$(".form-group #bookAuthor").typeahead(
|
||||||
promiseSeries.done(function() {
|
{
|
||||||
$("#series").typeahead(
|
highlight: true,
|
||||||
{
|
minLength: 1,
|
||||||
highlight: true, minLength: 0,
|
hint: true
|
||||||
hint: true
|
}, {
|
||||||
}, {
|
name: "authors",
|
||||||
name: "series",
|
display: 'name',
|
||||||
displayKey: "name",
|
source: function source(query, cb, asyncResults) {
|
||||||
source: series.ttAdapter()
|
return sourceSplit(query, cb, "&", authors);
|
||||||
}
|
}
|
||||||
);
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
var series = new Bloodhound({
|
||||||
|
name: "series",
|
||||||
|
datumTokenizer: function datumTokenizer(datum) {
|
||||||
|
return [datum.name];
|
||||||
|
},
|
||||||
|
// queryTokenizer: Bloodhound.tokenizers.whitespace,
|
||||||
|
queryTokenizer: function queryTokenizer(query) {
|
||||||
|
return [query];
|
||||||
|
},
|
||||||
|
remote: {
|
||||||
|
url: getPath() + "/get_series_json?q=%QUERY",
|
||||||
|
wildcard: '%QUERY',
|
||||||
|
/*replace: function replace(url, query) {
|
||||||
|
return url + encodeURIComponent(query);
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
});
|
||||||
|
$(".form-group #series").typeahead(
|
||||||
|
{
|
||||||
|
highlight: true,
|
||||||
|
minLength: 0,
|
||||||
|
hint: true
|
||||||
|
}, {
|
||||||
|
name: "series",
|
||||||
|
displayKey: "name",
|
||||||
|
source: series
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
var tags = new Bloodhound({
|
||||||
|
name: "tags",
|
||||||
|
datumTokenizer: function datumTokenizer(datum) {
|
||||||
|
return [datum.name];
|
||||||
|
},
|
||||||
|
queryTokenizer: function queryTokenizer(query) {
|
||||||
|
var tokens = query.split(",");
|
||||||
|
tokens = [tokens[tokens.length - 1].trim()];
|
||||||
|
return tokens;
|
||||||
|
},
|
||||||
|
remote: {
|
||||||
|
url: getPath() + "/get_tags_json?q=%QUERY",
|
||||||
|
wildcard: '%QUERY'
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var promiseTags = tags.initialize();
|
$(".form-group #tags").typeahead(
|
||||||
promiseTags.done(function() {
|
{
|
||||||
$("#tags").typeahead(
|
highlight: true,
|
||||||
{
|
minLength: 0,
|
||||||
highlight: true, minLength: 0,
|
hint: true
|
||||||
hint: true
|
}, {
|
||||||
}, {
|
name: "tags",
|
||||||
name: "tags",
|
display: "name",
|
||||||
displayKey: "name",
|
source: function source(query, cb, asyncResults) {
|
||||||
source: function source(query, cb) {
|
return sourceSplit(query, cb, ",", tags);
|
||||||
return sourceSplit(query, cb, ",", tags);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
);
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
var languages = new Bloodhound({
|
||||||
|
name: "languages",
|
||||||
|
datumTokenizer: function datumTokenizer(datum) {
|
||||||
|
return [datum.name];
|
||||||
|
},
|
||||||
|
queryTokenizer: function queryTokenizer(query) {
|
||||||
|
return [query];
|
||||||
|
},
|
||||||
|
remote: {
|
||||||
|
url: getPath() + "/get_languages_json?q=%QUERY",
|
||||||
|
wildcard: '%QUERY'
|
||||||
|
/*replace: function replace(url, query) {
|
||||||
|
return url + encodeURIComponent(query);
|
||||||
|
}*/
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var promiseLanguages = languages.initialize();
|
$(".form-group #languages").typeahead(
|
||||||
promiseLanguages.done(function() {
|
{
|
||||||
$("#languages").typeahead(
|
highlight: true, minLength: 0,
|
||||||
{
|
hint: true
|
||||||
highlight: true, minLength: 0,
|
}, {
|
||||||
hint: true
|
name: "languages",
|
||||||
}, {
|
display: "name",
|
||||||
name: "languages",
|
source: function source(query, cb, asyncResults) {
|
||||||
displayKey: "name",
|
return sourceSplit(query, cb, ",", languages);
|
||||||
source: function source(query, cb) {
|
|
||||||
return sourceSplit(query, cb, ",", languages); //(",")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
);
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
var publishers = new Bloodhound({
|
||||||
|
name: "publisher",
|
||||||
|
datumTokenizer: function datumTokenizer(datum) {
|
||||||
|
return [datum.name];
|
||||||
|
},
|
||||||
|
queryTokenizer: Bloodhound.tokenizers.whitespace,
|
||||||
|
remote: {
|
||||||
|
url: getPath() + "/get_publishers_json?q=%QUERY",
|
||||||
|
wildcard: '%QUERY'
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var promisePublishers = publishers.initialize();
|
$(".form-group #publisher").typeahead(
|
||||||
promisePublishers.done(function() {
|
{
|
||||||
$("#publisher").typeahead(
|
highlight: true, minLength: 0,
|
||||||
{
|
hint: true
|
||||||
highlight: true, minLength: 0,
|
}, {
|
||||||
hint: true
|
name: "publishers",
|
||||||
}, {
|
displayKey: "name",
|
||||||
name: "publishers",
|
source: publishers
|
||||||
displayKey: "name",
|
}
|
||||||
source: publishers.ttAdapter()
|
);
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#search").on("change input.typeahead:selected", function(event) {
|
$("#search").on("change input.typeahead:selected", function(event) {
|
||||||
if (event.target.type === "search" && event.target.tagName === "INPUT") {
|
if (event.target.type === "search" && event.target.tagName === "INPUT") {
|
||||||
|
|
2567
cps/static/js/libs/typeahead.bundle.js
vendored
2567
cps/static/js/libs/typeahead.bundle.js
vendored
File diff suppressed because it is too large
Load Diff
|
@ -58,11 +58,11 @@
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<button type="button" class="btn btn-default" id="xchange" ><span class="glyphicon glyphicon-arrow-up"></span><span class="glyphicon glyphicon-arrow-down"></span></button>
|
<button type="button" class="btn btn-default" id="xchange" ><span class="glyphicon glyphicon-arrow-up"></span><span class="glyphicon glyphicon-arrow-down"></span></button>
|
||||||
</div>
|
</div>
|
||||||
|
<div id="author_div" class="form-group">
|
||||||
<div class="form-group">
|
|
||||||
<label for="bookAuthor">{{_('Author')}}</label>
|
<label for="bookAuthor">{{_('Author')}}</label>
|
||||||
<input type="text" class="form-control typeahead" name="author_name" id="bookAuthor" value="{{' & '.join(authors)}}" autocomplete="off">
|
<input type="text" class="form-control typeahead" name="author_name" id="bookAuthor" value="{{' & '.join(authors)}}" autocomplete="off">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="description">{{_('Description')}}</label>
|
<label for="description">{{_('Description')}}</label>
|
||||||
<textarea class="form-control" name="description" id="description" rows="7">{% if book.comments %}{{book.comments[0].text}}{%endif%}</textarea>
|
<textarea class="form-control" name="description" id="description" rows="7">{% if book.comments %}{{book.comments[0].text}}{%endif%}</textarea>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user