mirror of
				https://github.com/janeczku/calibre-web
				synced 2025-10-30 23:03: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. | ||||
|  */ | ||||
|  | ||||
|     /* | ||||
|     Takes a prefix, query typeahead callback, Bloodhound typeahead adapter | ||||
|      and returns the completions it gets from the bloodhound engine prefixed. | ||||
|      */ | ||||
|     function prefixed_source(prefix, query, cb, bh_adapter) { | ||||
|         bh_adapter(query, function(retArray){ | ||||
|             var matches = []; | ||||
|             for (var i = 0; i < retArray.length; i++) { | ||||
|                 var obj = {name : prefix + retArray[i].name}; | ||||
|                 matches.push(obj); | ||||
|             } | ||||
|             cb(matches); | ||||
|         }); | ||||
| /* | ||||
| Takes a prefix, query typeahead callback, Bloodhound typeahead adapter | ||||
|  and returns the completions it gets from the bloodhound engine prefixed. | ||||
|  */ | ||||
| function prefixed_source(prefix, query, cb, bh_adapter) { | ||||
|     bh_adapter(query, function(retArray){ | ||||
|         var matches = []; | ||||
|         for (var i = 0; i < retArray.length; i++) { | ||||
|             var obj = {name : prefix + retArray[i].name}; | ||||
|             matches.push(obj); | ||||
|         } | ||||
|         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({ | ||||
|         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); | ||||
|   } | ||||
|     prefixed_source(prefix, current_author, cb, bh_adapter); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|     var promise = authors.initialize(); | ||||
| var promise = authors.initialize(); | ||||
|     promise.done(function(){ | ||||
|         $("#bookAuthor").typeahead( | ||||
|                 { | ||||
|                     highlight: true, minLength: 1, | ||||
|                     hint: true | ||||
|                 }, { | ||||
|                     name: 'authors', displayKey: 'name', | ||||
|                     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; | ||||
|     $("#bookAuthor").typeahead( | ||||
|             { | ||||
|                 highlight: true, minLength: 1, | ||||
|                 hint: true | ||||
|             }, { | ||||
|                 name: 'authors', displayKey: 'name', | ||||
|                 source: authors_source | ||||
|             } | ||||
|     ) | ||||
| }); | ||||
|  | ||||
| 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(){ | ||||
|         $("#series").typeahead( | ||||
|                 { | ||||
|                     highlight: true, minLength: 0, | ||||
|                     hint: true | ||||
|                 }, { | ||||
|                     name: 'series', displayKey: 'name', | ||||
|                     source: series.ttAdapter() | ||||
|                 } | ||||
|         ) | ||||
|     }); | ||||
|     $("#series").typeahead( | ||||
|             { | ||||
|                 highlight: true, minLength: 0, | ||||
|                 hint: true | ||||
|             }, { | ||||
|                 name: 'series', displayKey: 'name', | ||||
|                 source: series.ttAdapter() | ||||
|             } | ||||
|     ) | ||||
| }); | ||||
|  | ||||
|     var tags = new Bloodhound({ | ||||
|         name: 'tags', | ||||
|         datumTokenizer: function(datum) { | ||||
|             return [datum.name]; | ||||
|         }, | ||||
|         queryTokenizer: function(query) { | ||||
|             tokens = query.split(","); | ||||
|             tokens = [tokens[tokens.length-1].trim()]; | ||||
|             return tokens | ||||
|         }, | ||||
|         remote: { | ||||
|             url: '/get_tags_json?q=%QUERY' | ||||
|         } | ||||
|     }); | ||||
| var tags = new Bloodhound({ | ||||
|     name: 'tags', | ||||
|     datumTokenizer: function(datum) { | ||||
|         return [datum.name]; | ||||
|     }, | ||||
|     queryTokenizer: function(query) { | ||||
|         tokens = query.split(","); | ||||
|         tokens = [tokens[tokens.length-1].trim()]; | ||||
|         return tokens | ||||
|     }, | ||||
|     remote: { | ||||
|         url: get_path()+'/get_tags_json?q=%QUERY' | ||||
|     } | ||||
| }); | ||||
|  | ||||
|     function tag_source(query, cb) { | ||||
|         var bh_adapter = tags.ttAdapter(); | ||||
| function tag_source(query, cb) { | ||||
|     var bh_adapter = tags.ttAdapter(); | ||||
|  | ||||
|         var tokens = query.split(","); | ||||
|         var current_tag = tokens[tokens.length-1].trim(); | ||||
|     var tokens = query.split(","); | ||||
|     var current_tag = 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 tag = tokens[i].trim(); | ||||
|             prefix += tag + ", "; | ||||
|         } | ||||
|  | ||||
|         prefixed_source(prefix, current_tag, cb, bh_adapter); | ||||
|     tokens.splice(tokens.length-1, 1); // remove last element | ||||
|     var prefix = ""; | ||||
|     for (var i = 0; i < tokens.length; i++) { | ||||
|         var tag = tokens[i].trim(); | ||||
|         prefix += tag + ", "; | ||||
|     } | ||||
|  | ||||
|     var promise = tags.initialize(); | ||||
|     prefixed_source(prefix, current_tag, cb, bh_adapter); | ||||
| } | ||||
|  | ||||
| var promise = tags.initialize(); | ||||
|     promise.done(function(){ | ||||
|         $("#tags").typeahead( | ||||
|                 { | ||||
|                     highlight: true, minLength: 0, | ||||
|                     hint: true | ||||
|                 }, { | ||||
|                     name: 'tags', displayKey: 'name', | ||||
|                     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; | ||||
|     $("#tags").typeahead( | ||||
|             { | ||||
|                 highlight: true, minLength: 0, | ||||
|                 hint: true | ||||
|             }, { | ||||
|                 name: 'tags', displayKey: 'name', | ||||
|                 source: tag_source | ||||
|             } | ||||
|     ) | ||||
| }); | ||||
|  | ||||
| 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) { | ||||
|         var bh_adapter = languages.ttAdapter(); | ||||
| function language_source(query, cb) { | ||||
|     var bh_adapter = languages.ttAdapter(); | ||||
|  | ||||
|         var tokens = query.split(","); | ||||
|         var current_language = tokens[tokens.length-1].trim(); | ||||
|     var tokens = query.split(","); | ||||
|     var current_language = 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 tag = tokens[i].trim(); | ||||
|             prefix += tag + ", "; | ||||
|         } | ||||
|  | ||||
|         prefixed_source(prefix, current_language, cb, bh_adapter); | ||||
|     tokens.splice(tokens.length-1, 1); // remove last element | ||||
|     var prefix = ""; | ||||
|     for (var i = 0; i < tokens.length; i++) { | ||||
|         var tag = tokens[i].trim(); | ||||
|         prefix += tag + ", "; | ||||
|     } | ||||
|  | ||||
|     var promise = languages.initialize(); | ||||
|     prefixed_source(prefix, current_language, cb, bh_adapter); | ||||
| } | ||||
|  | ||||
| var promise = languages.initialize(); | ||||
|     promise.done(function(){ | ||||
|         $("#languages").typeahead( | ||||
|                 { | ||||
|                     highlight: true, minLength: 0, | ||||
|                     hint: true | ||||
|                 }, { | ||||
|                     name: 'languages', displayKey: 'name', | ||||
|                     source: language_source | ||||
|                 } | ||||
|         ) | ||||
|     $("#languages").typeahead( | ||||
|             { | ||||
|                 highlight: true, minLength: 0, | ||||
|                 hint: true | ||||
|             }, { | ||||
|                 name: 'languages', displayKey: 'name', | ||||
|                 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.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> | ||||
|  | ||||
| {% 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="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 %} | ||||
|       <img src="{{ url_for('static', filename='generic_cover.jpg') }}" /> | ||||
|     {% endif %} | ||||
|   | ||||
| @@ -40,7 +40,7 @@ | ||||
|         {% endfor %} | ||||
|       </div> | ||||
|     </div> | ||||
|     <label for="Tags">{{_('Exclude Series')}}</label> | ||||
|     <label for="Series">{{_('Exclude Series')}}</label> | ||||
|     <div class="form-group"> | ||||
|       <div class="btn-toolbar btn-toolbar-lg" data-toggle="buttons"> | ||||
|         {% 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/edit_books.js') }}"></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> | ||||
| {% endblock %} | ||||
| {% block header %} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 OzzieIsaacs
					OzzieIsaacs