mirror of
				https://github.com/janeczku/calibre-web
				synced 2025-10-31 07:13:02 +00:00 
			
		
		
		
	Fixed typeahead with reverse proxy
fixed marking of tags in advanced search seperated js and html
This commit is contained in:
		| @@ -2,178 +2,199 @@ | |||||||
|  * Created by SpeedProg on 05.04.2015. |  * Created by SpeedProg on 05.04.2015. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
|     /* | /* | ||||||
|     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 prefixed_source(prefix, query, cb, bh_adapter) { | function prefixed_source(prefix, query, cb, bh_adapter) { | ||||||
|         bh_adapter(query, function(retArray){ |     bh_adapter(query, function(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); | ||||||
|         }); |     }); | ||||||
|  | } | ||||||
|  | function get_path(){ | ||||||
|  |     var jsFileLocation = $('script[src*=edit_books]').attr('src');  // the js file path | ||||||
|  |     jsFileLocation = jsFileLocation.replace('/static/js/edit_books.js', '');   // the js folder path | ||||||
|  |     return jsFileLocation; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | var authors = new Bloodhound({ | ||||||
|  |     name: 'authors', | ||||||
|  |     datumTokenizer: function(datum) { | ||||||
|  |         return [datum.name]; | ||||||
|  |     }, | ||||||
|  |     queryTokenizer: Bloodhound.tokenizers.whitespace, | ||||||
|  |     remote: { | ||||||
|  |         url: get_path()+'/get_authors_json?q=%QUERY' | ||||||
|  |     } | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | function authors_source(query, cb) { | ||||||
|  |     var bh_adapter = authors.ttAdapter(); | ||||||
|  |  | ||||||
|  |     var tokens = query.split("&"); | ||||||
|  |     var current_author = tokens[tokens.length-1].trim(); | ||||||
|  |  | ||||||
|  |     tokens.splice(tokens.length-1, 1); // remove last element | ||||||
|  |     var prefix = ""; | ||||||
|  |     for (var i = 0; i < tokens.length; i++) { | ||||||
|  |         var author = tokens[i].trim(); | ||||||
|  |         prefix += author + " & "; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|    var authors = new Bloodhound({ |     prefixed_source(prefix, current_author, cb, bh_adapter); | ||||||
|         name: 'authors', | } | ||||||
|         datumTokenizer: function(datum) { |  | ||||||
|             return [datum.name]; |  | ||||||
|         }, |  | ||||||
|         queryTokenizer: Bloodhound.tokenizers.whitespace, |  | ||||||
|         remote: { |  | ||||||
|             url: '/get_authors_json?q=%QUERY' |  | ||||||
|         } |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     function authors_source(query, cb) { |  | ||||||
|         var bh_adapter = authors.ttAdapter(); |  | ||||||
|  |  | ||||||
|         var tokens = query.split("&"); |  | ||||||
|         var current_author = tokens[tokens.length-1].trim(); |  | ||||||
|  |  | ||||||
|         tokens.splice(tokens.length-1, 1); // remove last element |  | ||||||
|         var prefix = ""; |  | ||||||
|         for (var i = 0; i < tokens.length; i++) { |  | ||||||
|             var author = tokens[i].trim(); |  | ||||||
|             prefix += author + " & "; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         prefixed_source(prefix, current_author, cb, bh_adapter); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|     var promise = authors.initialize(); | var promise = authors.initialize(); | ||||||
|     promise.done(function(){ |     promise.done(function(){ | ||||||
|         $("#bookAuthor").typeahead( |     $("#bookAuthor").typeahead( | ||||||
|                 { |             { | ||||||
|                     highlight: true, minLength: 1, |                 highlight: true, minLength: 1, | ||||||
|                     hint: true |                 hint: true | ||||||
|                 }, { |             }, { | ||||||
|                     name: 'authors', displayKey: 'name', |                 name: 'authors', displayKey: 'name', | ||||||
|                     source: authors_source |                 source: authors_source | ||||||
|                 } |  | ||||||
|         ) |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     var series = new Bloodhound({ |  | ||||||
|         name: 'series', |  | ||||||
|         datumTokenizer: function(datum) { |  | ||||||
|             return [datum.name]; |  | ||||||
|         }, |  | ||||||
|         queryTokenizer: function(query) { |  | ||||||
|             return [query]; |  | ||||||
|         }, |  | ||||||
|         remote: { |  | ||||||
|             url: '/get_series_json?q=', |  | ||||||
|             replace: function(url, query) { |  | ||||||
|                 url_query = url+encodeURIComponent(query); |  | ||||||
|                 return url_query; |  | ||||||
|             } |             } | ||||||
|  |     ) | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | var series = new Bloodhound({ | ||||||
|  |     name: 'series', | ||||||
|  |     datumTokenizer: function(datum) { | ||||||
|  |         return [datum.name]; | ||||||
|  |     }, | ||||||
|  |     queryTokenizer: function(query) { | ||||||
|  |         return [query]; | ||||||
|  |     }, | ||||||
|  |     remote: { | ||||||
|  |         url: get_path()+'/get_series_json?q=', | ||||||
|  |         replace: function(url, query) { | ||||||
|  |             url_query = url+encodeURIComponent(query); | ||||||
|  |             return url_query; | ||||||
|         } |         } | ||||||
|     }); |     } | ||||||
|     var promise = series.initialize(); | }); | ||||||
|  | var promise = series.initialize(); | ||||||
|     promise.done(function(){ |     promise.done(function(){ | ||||||
|         $("#series").typeahead( |     $("#series").typeahead( | ||||||
|                 { |             { | ||||||
|                     highlight: true, minLength: 0, |                 highlight: true, minLength: 0, | ||||||
|                     hint: true |                 hint: true | ||||||
|                 }, { |             }, { | ||||||
|                     name: 'series', displayKey: 'name', |                 name: 'series', displayKey: 'name', | ||||||
|                     source: series.ttAdapter() |                 source: series.ttAdapter() | ||||||
|                 } |             } | ||||||
|         ) |     ) | ||||||
|     }); | }); | ||||||
|  |  | ||||||
|     var tags = new Bloodhound({ | var tags = new Bloodhound({ | ||||||
|         name: 'tags', |     name: 'tags', | ||||||
|         datumTokenizer: function(datum) { |     datumTokenizer: function(datum) { | ||||||
|             return [datum.name]; |         return [datum.name]; | ||||||
|         }, |     }, | ||||||
|         queryTokenizer: function(query) { |     queryTokenizer: function(query) { | ||||||
|             tokens = query.split(","); |         tokens = query.split(","); | ||||||
|             tokens = [tokens[tokens.length-1].trim()]; |         tokens = [tokens[tokens.length-1].trim()]; | ||||||
|             return tokens |         return tokens | ||||||
|         }, |     }, | ||||||
|         remote: { |     remote: { | ||||||
|             url: '/get_tags_json?q=%QUERY' |         url: get_path()+'/get_tags_json?q=%QUERY' | ||||||
|         } |     } | ||||||
|     }); | }); | ||||||
|  |  | ||||||
|     function tag_source(query, cb) { | function tag_source(query, cb) { | ||||||
|         var bh_adapter = tags.ttAdapter(); |     var bh_adapter = tags.ttAdapter(); | ||||||
|  |  | ||||||
|         var tokens = query.split(","); |     var tokens = query.split(","); | ||||||
|         var current_tag = tokens[tokens.length-1].trim(); |     var current_tag = tokens[tokens.length-1].trim(); | ||||||
|  |  | ||||||
|         tokens.splice(tokens.length-1, 1); // remove last element |     tokens.splice(tokens.length-1, 1); // remove last element | ||||||
|         var prefix = ""; |     var prefix = ""; | ||||||
|         for (var i = 0; i < tokens.length; i++) { |     for (var i = 0; i < tokens.length; i++) { | ||||||
|             var tag = tokens[i].trim(); |         var tag = tokens[i].trim(); | ||||||
|             prefix += tag + ", "; |         prefix += tag + ", "; | ||||||
|         } |  | ||||||
|  |  | ||||||
|         prefixed_source(prefix, current_tag, cb, bh_adapter); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     var promise = tags.initialize(); |     prefixed_source(prefix, current_tag, cb, bh_adapter); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | var promise = tags.initialize(); | ||||||
|     promise.done(function(){ |     promise.done(function(){ | ||||||
|         $("#tags").typeahead( |     $("#tags").typeahead( | ||||||
|                 { |             { | ||||||
|                     highlight: true, minLength: 0, |                 highlight: true, minLength: 0, | ||||||
|                     hint: true |                 hint: true | ||||||
|                 }, { |             }, { | ||||||
|                     name: 'tags', displayKey: 'name', |                 name: 'tags', displayKey: 'name', | ||||||
|                     source: tag_source |                 source: tag_source | ||||||
|                 } |  | ||||||
|         ) |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     var languages = new Bloodhound({ |  | ||||||
|         name: 'languages', |  | ||||||
|         datumTokenizer: function(datum) { |  | ||||||
|             return [datum.name]; |  | ||||||
|         }, |  | ||||||
|         queryTokenizer: function(query) { |  | ||||||
|             return [query]; |  | ||||||
|         }, |  | ||||||
|         remote: { |  | ||||||
|             url: '/get_languages_json?q=', |  | ||||||
|             replace: function(url, query) { |  | ||||||
|                 url_query = url+encodeURIComponent(query); |  | ||||||
|                 return url_query; |  | ||||||
|             } |             } | ||||||
|  |     ) | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | var languages = new Bloodhound({ | ||||||
|  |     name: 'languages', | ||||||
|  |     datumTokenizer: function(datum) { | ||||||
|  |         return [datum.name]; | ||||||
|  |     }, | ||||||
|  |     queryTokenizer: function(query) { | ||||||
|  |         return [query]; | ||||||
|  |     }, | ||||||
|  |     remote: { | ||||||
|  |         url: get_path()+'/get_languages_json?q=', | ||||||
|  |         replace: function(url, query) { | ||||||
|  |             url_query = url+encodeURIComponent(query); | ||||||
|  |             return url_query; | ||||||
|         } |         } | ||||||
|     }); |     } | ||||||
|  | }); | ||||||
|  |  | ||||||
|     function language_source(query, cb) { | function language_source(query, cb) { | ||||||
|         var bh_adapter = languages.ttAdapter(); |     var bh_adapter = languages.ttAdapter(); | ||||||
|  |  | ||||||
|         var tokens = query.split(","); |     var tokens = query.split(","); | ||||||
|         var current_language = tokens[tokens.length-1].trim(); |     var current_language = tokens[tokens.length-1].trim(); | ||||||
|  |  | ||||||
|         tokens.splice(tokens.length-1, 1); // remove last element |     tokens.splice(tokens.length-1, 1); // remove last element | ||||||
|         var prefix = ""; |     var prefix = ""; | ||||||
|         for (var i = 0; i < tokens.length; i++) { |     for (var i = 0; i < tokens.length; i++) { | ||||||
|             var tag = tokens[i].trim(); |         var tag = tokens[i].trim(); | ||||||
|             prefix += tag + ", "; |         prefix += tag + ", "; | ||||||
|         } |  | ||||||
|  |  | ||||||
|         prefixed_source(prefix, current_language, cb, bh_adapter); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     var promise = languages.initialize(); |     prefixed_source(prefix, current_language, cb, bh_adapter); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | var promise = languages.initialize(); | ||||||
|     promise.done(function(){ |     promise.done(function(){ | ||||||
|         $("#languages").typeahead( |     $("#languages").typeahead( | ||||||
|                 { |             { | ||||||
|                     highlight: true, minLength: 0, |                 highlight: true, minLength: 0, | ||||||
|                     hint: true |                 hint: true | ||||||
|                 }, { |             }, { | ||||||
|                     name: 'languages', displayKey: 'name', |                 name: 'languages', displayKey: 'name', | ||||||
|                     source: language_source |                 source: language_source | ||||||
|                 } |             } | ||||||
|         ) |     ) | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | $('form').on('change input typeahead:selected', function(data){ | ||||||
|  |     form = $('form').serialize(); | ||||||
|  |     $.getJSON( get_path()+"/get_matching_tags", form, function( data ) { | ||||||
|  |       $('.tags_click').each(function() { | ||||||
|  |         if ($.inArray(parseInt($(this).children('input').first().val(), 10), data.tags) == -1 ) { | ||||||
|  |           if (!($(this).hasClass('active'))) { | ||||||
|  |             $(this).addClass('disabled'); | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |         else { | ||||||
|  |           $(this).removeClass('disabled'); | ||||||
|  |         } | ||||||
|  |       }); | ||||||
|     }); |     }); | ||||||
|  | }); | ||||||
|   | |||||||
| @@ -25,6 +25,39 @@ $(function() { | |||||||
|         $this.text('Please wait...'); |         $this.text('Please wait...'); | ||||||
|         $this.addClass('disabled'); |         $this.addClass('disabled'); | ||||||
|     }); |     }); | ||||||
|  |     $("#restart").click(function() { | ||||||
|  |         $.ajax({ | ||||||
|  |             dataType: 'json', | ||||||
|  |             url: window.location.pathname+"/../../shutdown", | ||||||
|  |             data: {"parameter":0}, | ||||||
|  |             success: function(data) { | ||||||
|  |                 return alert(data.text);} | ||||||
|  |         }); | ||||||
|  |     }); | ||||||
|  |     $("#shutdown").click(function() { | ||||||
|  |         $.ajax({ | ||||||
|  |             dataType: 'json', | ||||||
|  |             url: window.location.pathname+"/../../shutdown", | ||||||
|  |             data: {"parameter":1}, | ||||||
|  |             success: function(data) { | ||||||
|  |                 return alert(data.text);} | ||||||
|  |         }); | ||||||
|  |     }); | ||||||
|  |     $("#check_for_update").click(function() { | ||||||
|  |         var button_text = $("#check_for_update").html(); | ||||||
|  |         $("#check_for_update").html('Checking...'); | ||||||
|  |         $.ajax({ | ||||||
|  |             dataType: 'json', | ||||||
|  |             url: window.location.pathname+"/../../get_update_status", | ||||||
|  |             success: function(data) { | ||||||
|  |             if (data.status == true) { | ||||||
|  |                 $("#check_for_update").addClass('hidden'); | ||||||
|  |                 $("#perform_update").removeClass('hidden'); | ||||||
|  |             }else{ | ||||||
|  |                 $("#check_for_update").html(button_text); | ||||||
|  |             };} | ||||||
|  |         }); | ||||||
|  |     }); | ||||||
|  |  | ||||||
| }); | }); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -115,40 +115,3 @@ | |||||||
| </div> | </div> | ||||||
|  |  | ||||||
| {% endblock %} | {% endblock %} | ||||||
| {% block js %} |  | ||||||
| <script type="text/javascript"> |  | ||||||
|     $("#restart").click(function() { |  | ||||||
|         $.ajax({ |  | ||||||
|             dataType: 'json', |  | ||||||
|             url: "{{url_for('shutdown')}}", |  | ||||||
|             data: {"parameter":0}, |  | ||||||
|             //data: data, |  | ||||||
|             success: function(data) { |  | ||||||
|                 return alert(data.text);} |  | ||||||
|         }); |  | ||||||
|     }); |  | ||||||
|     $("#shutdown").click(function() { |  | ||||||
|         $.ajax({ |  | ||||||
|             dataType: 'json', |  | ||||||
|             url: "{{url_for('shutdown')}}", |  | ||||||
|             data: {"parameter":1}, |  | ||||||
|             success: function(data) { |  | ||||||
|                 return alert(data.text);} |  | ||||||
|         }); |  | ||||||
|     }); |  | ||||||
|     $("#check_for_update").click(function() { |  | ||||||
|         $("#check_for_update").html('Checking...'); |  | ||||||
|         $.ajax({ |  | ||||||
|             dataType: 'json', |  | ||||||
|             url: "{{url_for('get_update_status')}}", |  | ||||||
|             success: function(data) { |  | ||||||
|             if (data.status == true) { |  | ||||||
|                 $("#check_for_update").addClass('hidden'); |  | ||||||
|                 $("#perform_update").removeClass('hidden'); |  | ||||||
|             }else{ |  | ||||||
|                 $("#check_for_update").html('{{_('Check for update')}}'); |  | ||||||
|             };} |  | ||||||
|         }); |  | ||||||
|     }); |  | ||||||
| </script> |  | ||||||
| {% endblock %} |  | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ | |||||||
| <div class="col-sm-3 col-lg-3 col-xs-12"> | <div class="col-sm-3 col-lg-3 col-xs-12"> | ||||||
|   <div class="cover"> |   <div class="cover"> | ||||||
|     {% if book.has_cover %} |     {% if book.has_cover %} | ||||||
|       <img src="{{ url_for('get_cover', cover_path=book.path) }}" /> |       <img src="{{ url_for('get_cover', cover_path=book.path.replace('\\','/')) }}" /> | ||||||
|     {% else %} |     {% else %} | ||||||
|       <img src="{{ url_for('static', filename='generic_cover.jpg') }}" /> |       <img src="{{ url_for('static', filename='generic_cover.jpg') }}" /> | ||||||
|     {% endif %} |     {% endif %} | ||||||
|   | |||||||
| @@ -40,7 +40,7 @@ | |||||||
|         {% endfor %} |         {% endfor %} | ||||||
|       </div> |       </div> | ||||||
|     </div> |     </div> | ||||||
|     <label for="Tags">{{_('Exclude Series')}}</label> |     <label for="Series">{{_('Exclude Series')}}</label> | ||||||
|     <div class="form-group"> |     <div class="form-group"> | ||||||
|       <div class="btn-toolbar btn-toolbar-lg" data-toggle="buttons"> |       <div class="btn-toolbar btn-toolbar-lg" data-toggle="buttons"> | ||||||
|         {% for serie in series %} |         {% for serie in series %} | ||||||
| @@ -81,21 +81,6 @@ | |||||||
| <script src="{{ url_for('static', filename='js/typeahead.bundle.js') }}"></script> | <script src="{{ url_for('static', filename='js/typeahead.bundle.js') }}"></script> | ||||||
| <script src="{{ url_for('static', filename='js/edit_books.js') }}"></script> | <script src="{{ url_for('static', filename='js/edit_books.js') }}"></script> | ||||||
| <script> | <script> | ||||||
|   $('form')}}.on('change input typeahead:selected', function() { |  | ||||||
|     form = $('form')}}.serialize(); |  | ||||||
|     $.getJSON( "{{ url_for('get_matching_tags') }}", form, function( data ) { |  | ||||||
|       $('.tags_click').each(function() { |  | ||||||
|         if ($.inArray(parseInt($(this).children('input').first().val(), 10), data.tags) == -1 ) { |  | ||||||
|           if (!($(this).hasClass('active'))) { |  | ||||||
|             $(this).addClass('disabled'); |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|         else { |  | ||||||
|           $(this).removeClass('disabled'); |  | ||||||
|         } |  | ||||||
|       }); |  | ||||||
|     }); |  | ||||||
|   }); |  | ||||||
| </script> | </script> | ||||||
| {% endblock %} | {% endblock %} | ||||||
| {% block header %} | {% block header %} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 OzzieIsaacs
					OzzieIsaacs