mirror of
				https://github.com/NodeBB/NodeBB.git
				synced 2025-10-31 11:05:54 +01:00 
			
		
		
		
	refactor: move search functions from app.js to search module
deprecate: app.handleSearch, use search.init(options) instead app.enableTopicSearch, use search.enableQuickSearch(options) instead app.prepareSearch, use search.showAndFocusInput() instead
This commit is contained in:
		| @@ -75,10 +75,6 @@ app.cacheBuster = null; | |||||||
| 	app.load = function () { | 	app.load = function () { | ||||||
| 		handleStatusChange(); | 		handleStatusChange(); | ||||||
|  |  | ||||||
| 		if (config.searchEnabled) { |  | ||||||
| 			app.handleSearch(); |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		$('body').on('click', '#new_topic', function (e) { | 		$('body').on('click', '#new_topic', function (e) { | ||||||
| 			e.preventDefault(); | 			e.preventDefault(); | ||||||
| 			app.newTopic(); | 			app.newTopic(); | ||||||
| @@ -103,17 +99,19 @@ app.cacheBuster = null; | |||||||
| 			'forum/pagination', | 			'forum/pagination', | ||||||
| 			'translator', | 			'translator', | ||||||
| 			'messages', | 			'messages', | ||||||
|  | 			'search', | ||||||
| 			'forum/unread', | 			'forum/unread', | ||||||
| 			'forum/header/notifications', | 			'forum/header/notifications', | ||||||
| 			'forum/header/chat', | 			'forum/header/chat', | ||||||
| 			'timeago/jquery.timeago', | 			'timeago/jquery.timeago', | ||||||
| 		], function (taskbar, helpers, pagination, translator, messages, unread, notifications, chat) { | 		], function (taskbar, helpers, pagination, translator, messages, search, unread, notifications, chat) { | ||||||
| 			notifications.prepareDOM(); | 			notifications.prepareDOM(); | ||||||
| 			chat.prepareDOM(); | 			chat.prepareDOM(); | ||||||
| 			translator.prepareDOM(); | 			translator.prepareDOM(); | ||||||
| 			taskbar.init(); | 			taskbar.init(); | ||||||
| 			helpers.register(); | 			helpers.register(); | ||||||
| 			pagination.init(); | 			pagination.init(); | ||||||
|  | 			search.init(); | ||||||
|  |  | ||||||
| 			if (app.user.uid > 0) { | 			if (app.user.uid > 0) { | ||||||
| 				unread.initUnreadTopics(); | 				unread.initUnreadTopics(); | ||||||
| @@ -404,218 +402,24 @@ app.cacheBuster = null; | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	app.enableTopicSearch = function (options) { | 	app.enableTopicSearch = function (options) { | ||||||
| 		if (!config.searchEnabled || !app.user.privileges['search:content']) { | 		console.warn('[deprecated] app.enableTopicSearch is deprecated, please use search.enableQuickSearch(options)'); | ||||||
| 			return; | 		require(['search'], function (search) { | ||||||
| 		} | 			search.enableQuickSearch(options); | ||||||
| 		/* eslint-disable-next-line */ |  | ||||||
| 		const searchOptions = Object.assign({ in: config.searchDefaultInQuick || 'titles' }, options.searchOptions); |  | ||||||
| 		const quickSearchResults = options.searchElements.resultEl; |  | ||||||
| 		const inputEl = options.searchElements.inputEl; |  | ||||||
| 		let oldValue = inputEl.val(); |  | ||||||
| 		const filterCategoryEl = quickSearchResults.find('.filter-category'); |  | ||||||
|  |  | ||||||
| 		function updateCategoryFilterName() { |  | ||||||
| 			if (ajaxify.data.template.category) { |  | ||||||
| 				require(['translator'], function (translator) { |  | ||||||
| 					translator.translate('[[search:search-in-category, ' + ajaxify.data.name + ']]', function (translated) { |  | ||||||
| 						const name = $('<div></div>').html(translated).text(); |  | ||||||
| 						filterCategoryEl.find('.name').text(name); |  | ||||||
| 					}); |  | ||||||
| 				}); |  | ||||||
| 			} |  | ||||||
| 			filterCategoryEl.toggleClass('hidden', !ajaxify.data.template.category); |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		function doSearch() { |  | ||||||
| 			require(['search'], function (search) { |  | ||||||
| 				/* eslint-disable-next-line */ |  | ||||||
| 				options.searchOptions = Object.assign({}, searchOptions); |  | ||||||
| 				options.searchOptions.term = inputEl.val(); |  | ||||||
| 				updateCategoryFilterName(); |  | ||||||
|  |  | ||||||
| 				if (ajaxify.data.template.category) { |  | ||||||
| 					if (filterCategoryEl.find('input[type="checkbox"]').is(':checked')) { |  | ||||||
| 						options.searchOptions.categories = [ajaxify.data.cid]; |  | ||||||
| 						options.searchOptions.searchChildren = true; |  | ||||||
| 					} |  | ||||||
| 				} |  | ||||||
|  |  | ||||||
| 				quickSearchResults.removeClass('hidden').find('.quick-search-results-container').html(''); |  | ||||||
| 				quickSearchResults.find('.loading-indicator').removeClass('hidden'); |  | ||||||
| 				hooks.fire('action:search.quick.start', options); |  | ||||||
| 				options.searchOptions.searchOnly = 1; |  | ||||||
| 				search.api(options.searchOptions, function (data) { |  | ||||||
| 					quickSearchResults.find('.loading-indicator').addClass('hidden'); |  | ||||||
| 					if (options.hideOnNoMatches && !data.posts.length) { |  | ||||||
| 						return quickSearchResults.addClass('hidden').find('.quick-search-results-container').html(''); |  | ||||||
| 					} |  | ||||||
| 					data.posts.forEach(function (p) { |  | ||||||
| 						const text = $('<div>' + p.content + '</div>').text(); |  | ||||||
| 						const query = inputEl.val().toLowerCase().replace(/^in:topic-\d+/, ''); |  | ||||||
| 						const start = Math.max(0, text.toLowerCase().indexOf(query) - 40); |  | ||||||
| 						p.snippet = utils.escapeHTML((start > 0 ? '...' : '') + |  | ||||||
| 							text.slice(start, start + 80) + |  | ||||||
| 							(text.length - start > 80 ? '...' : '')); |  | ||||||
| 					}); |  | ||||||
| 					app.parseAndTranslate('partials/quick-search-results', data, function (html) { |  | ||||||
| 						if (html.length) { |  | ||||||
| 							html.find('.timeago').timeago(); |  | ||||||
| 						} |  | ||||||
| 						quickSearchResults.toggleClass('hidden', !html.length || !inputEl.is(':focus')) |  | ||||||
| 							.find('.quick-search-results-container') |  | ||||||
| 							.html(html.length ? html : ''); |  | ||||||
| 						const highlightEls = quickSearchResults.find( |  | ||||||
| 							'.quick-search-results .quick-search-title, .quick-search-results .snippet' |  | ||||||
| 						); |  | ||||||
| 						search.highlightMatches(options.searchOptions.term, highlightEls); |  | ||||||
| 						hooks.fire('action:search.quick.complete', { |  | ||||||
| 							data: data, |  | ||||||
| 							options: options, |  | ||||||
| 						}); |  | ||||||
| 					}); |  | ||||||
| 				}); |  | ||||||
| 			}); |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		quickSearchResults.find('.filter-category input[type="checkbox"]').on('change', function () { |  | ||||||
| 			inputEl.focus(); |  | ||||||
| 			doSearch(); |  | ||||||
| 		}); |  | ||||||
|  |  | ||||||
| 		inputEl.off('keyup').on('keyup', utils.debounce(function () { |  | ||||||
| 			if (inputEl.val().length < 3) { |  | ||||||
| 				quickSearchResults.addClass('hidden'); |  | ||||||
| 				oldValue = inputEl.val(); |  | ||||||
| 				return; |  | ||||||
| 			} |  | ||||||
| 			if (inputEl.val() === oldValue) { |  | ||||||
| 				return; |  | ||||||
| 			} |  | ||||||
| 			oldValue = inputEl.val(); |  | ||||||
| 			if (!inputEl.is(':focus')) { |  | ||||||
| 				return quickSearchResults.addClass('hidden'); |  | ||||||
| 			} |  | ||||||
| 			doSearch(); |  | ||||||
| 		}, 500)); |  | ||||||
|  |  | ||||||
| 		let mousedownOnResults = false; |  | ||||||
| 		quickSearchResults.on('mousedown', function () { |  | ||||||
| 			$(window).one('mouseup', function () { |  | ||||||
| 				quickSearchResults.addClass('hidden'); |  | ||||||
| 			}); |  | ||||||
| 			mousedownOnResults = true; |  | ||||||
| 		}); |  | ||||||
| 		inputEl.on('blur', function () { |  | ||||||
| 			if (!inputEl.is(':focus') && !mousedownOnResults && !quickSearchResults.hasClass('hidden')) { |  | ||||||
| 				quickSearchResults.addClass('hidden'); |  | ||||||
| 			} |  | ||||||
| 		}); |  | ||||||
|  |  | ||||||
| 		let ajaxified = false; |  | ||||||
| 		require(['hooks'], function (hooks) { |  | ||||||
| 			hooks.on('action:ajaxify.end', function () { |  | ||||||
| 				if (!ajaxify.isCold()) { |  | ||||||
| 					ajaxified = true; |  | ||||||
| 				} |  | ||||||
| 			}); |  | ||||||
| 		}); |  | ||||||
|  |  | ||||||
| 		inputEl.on('focus', function () { |  | ||||||
| 			mousedownOnResults = false; |  | ||||||
| 			const query = inputEl.val(); |  | ||||||
| 			oldValue = query; |  | ||||||
| 			if (query && quickSearchResults.find('#quick-search-results').children().length) { |  | ||||||
| 				updateCategoryFilterName(); |  | ||||||
| 				if (ajaxified) { |  | ||||||
| 					doSearch(); |  | ||||||
| 					ajaxified = false; |  | ||||||
| 				} else { |  | ||||||
| 					quickSearchResults.removeClass('hidden'); |  | ||||||
| 				} |  | ||||||
| 				inputEl[0].setSelectionRange( |  | ||||||
| 					query.startsWith('in:topic') ? query.indexOf(' ') + 1 : 0, |  | ||||||
| 					query.length |  | ||||||
| 				); |  | ||||||
| 			} |  | ||||||
| 		}); |  | ||||||
|  |  | ||||||
| 		inputEl.off('refresh').on('refresh', function () { |  | ||||||
| 			doSearch(); |  | ||||||
| 		}); | 		}); | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
| 	app.handleSearch = function (searchOptions) { | 	app.handleSearch = function (searchOptions) { | ||||||
| 		searchOptions = searchOptions || { in: config.searchDefaultInQuick || 'titles' }; | 		console.warn('[deprecated] app.handleSearch is deprecated, please use search.init(options)'); | ||||||
| 		const searchButton = $('#search-button'); | 		require(['search'], function (search) { | ||||||
| 		const searchFields = $('#search-fields'); | 			search.init(searchOptions); | ||||||
| 		const searchInput = $('#search-fields input'); |  | ||||||
| 		const quickSearchContainer = $('#quick-search-container'); |  | ||||||
|  |  | ||||||
| 		$('#search-form .advanced-search-link').off('mousedown').on('mousedown', function () { |  | ||||||
| 			ajaxify.go('/search'); |  | ||||||
| 		}); |  | ||||||
|  |  | ||||||
| 		$('#search-form').off('submit').on('submit', function () { |  | ||||||
| 			searchInput.blur(); |  | ||||||
| 		}); |  | ||||||
| 		searchInput.off('blur').on('blur', dismissSearch); |  | ||||||
| 		searchInput.off('focus'); |  | ||||||
|  |  | ||||||
| 		const searchElements = { |  | ||||||
| 			inputEl: searchInput, |  | ||||||
| 			resultEl: quickSearchContainer, |  | ||||||
| 		}; |  | ||||||
|  |  | ||||||
| 		app.enableTopicSearch({ |  | ||||||
| 			searchOptions: searchOptions, |  | ||||||
| 			searchElements: searchElements, |  | ||||||
| 		}); |  | ||||||
|  |  | ||||||
| 		function dismissSearch() { |  | ||||||
| 			setTimeout(function () { |  | ||||||
| 				if (!searchInput.is(':focus')) { |  | ||||||
| 					searchFields.addClass('hidden'); |  | ||||||
| 					searchButton.removeClass('hidden'); |  | ||||||
| 				} |  | ||||||
| 			}, 200); |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		searchButton.off('click').on('click', function (e) { |  | ||||||
| 			if (!config.loggedIn && !app.user.privileges['search:content']) { |  | ||||||
| 				app.alert({ |  | ||||||
| 					message: '[[error:search-requires-login]]', |  | ||||||
| 					timeout: 3000, |  | ||||||
| 				}); |  | ||||||
| 				ajaxify.go('login'); |  | ||||||
| 				return false; |  | ||||||
| 			} |  | ||||||
| 			e.stopPropagation(); |  | ||||||
|  |  | ||||||
| 			app.prepareSearch(); |  | ||||||
| 			return false; |  | ||||||
| 		}); |  | ||||||
|  |  | ||||||
| 		$('#search-form').off('submit').on('submit', function () { |  | ||||||
| 			const input = $(this).find('input'); |  | ||||||
| 			require(['search'], function (search) { |  | ||||||
| 				const data = search.getSearchPreferences(); |  | ||||||
| 				data.term = input.val(); |  | ||||||
| 				hooks.fire('action:search.submit', { |  | ||||||
| 					searchOptions: data, |  | ||||||
| 					searchElements: searchElements, |  | ||||||
| 				}); |  | ||||||
| 				search.query(data, function () { |  | ||||||
| 					input.val(''); |  | ||||||
| 				}); |  | ||||||
| 			}); |  | ||||||
| 			return false; |  | ||||||
| 		}); | 		}); | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
| 	app.prepareSearch = function () { | 	app.prepareSearch = function () { | ||||||
| 		$('#search-fields').removeClass('hidden'); | 		console.warn('[deprecated] app.prepareSearch is deprecated, please use search.showAndFocusInput()'); | ||||||
| 		$('#search-button').addClass('hidden'); | 		require(['search'], function (search) { | ||||||
| 		$('#search-fields input').focus(); | 			search.showAndFocusInput(); | ||||||
|  | 		}); | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
| 	function handleStatusChange() { | 	function handleStatusChange() { | ||||||
|   | |||||||
| @@ -69,12 +69,12 @@ define('forum/topic', [ | |||||||
|  |  | ||||||
| 	function handleTopicSearch() { | 	function handleTopicSearch() { | ||||||
| 		if (config.topicSearchEnabled) { | 		if (config.topicSearchEnabled) { | ||||||
| 			require(['mousetrap'], function (mousetrap) { | 			require(['mousetrap', 'search'], function (mousetrap, search) { | ||||||
| 				mousetrap.bind(['command+f', 'ctrl+f'], function (e) { | 				mousetrap.bind(['command+f', 'ctrl+f'], function (e) { | ||||||
| 					if (ajaxify.data.template.topic) { | 					if (ajaxify.data.template.topic) { | ||||||
| 						e.preventDefault(); | 						e.preventDefault(); | ||||||
| 						$('#search-fields input').val('in:topic-' + ajaxify.data.tid + ' '); | 						$('#search-fields input').val('in:topic-' + ajaxify.data.tid + ' '); | ||||||
| 						app.prepareSearch(); | 						search.showAndFocusInput(); | ||||||
| 					} | 					} | ||||||
| 				}); | 				}); | ||||||
| 			}); | 			}); | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| 'use strict'; | 'use strict'; | ||||||
|  |  | ||||||
|  |  | ||||||
| define('forum/topic/merge', function () { | define('forum/topic/merge', ['search'], function (search) { | ||||||
| 	const Merge = {}; | 	const Merge = {}; | ||||||
| 	let modal; | 	let modal; | ||||||
| 	let mergeBtn; | 	let mergeBtn; | ||||||
| @@ -30,7 +30,7 @@ define('forum/topic/merge', function () { | |||||||
| 				mergeTopics(mergeBtn); | 				mergeTopics(mergeBtn); | ||||||
| 			}); | 			}); | ||||||
|  |  | ||||||
| 			app.enableTopicSearch({ | 			search.enableQuickSearch({ | ||||||
| 				searchElements: { | 				searchElements: { | ||||||
| 					inputEl: modal.find('.topic-search-input'), | 					inputEl: modal.find('.topic-search-input'), | ||||||
| 					resultEl: modal.find('.quick-search-container'), | 					resultEl: modal.find('.quick-search-container'), | ||||||
|   | |||||||
| @@ -1,11 +1,219 @@ | |||||||
| 'use strict'; | 'use strict'; | ||||||
|  |  | ||||||
|  | define('search', ['translator', 'storage', 'hooks'], function (translator, storage, hooks) { | ||||||
| define('search', ['navigator', 'translator', 'storage', 'hooks'], function (nav, translator, storage, hooks) { |  | ||||||
| 	const Search = { | 	const Search = { | ||||||
| 		current: {}, | 		current: {}, | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
|  | 	Search.init = function (searchOptions) { | ||||||
|  | 		if (!config.searchEnabled) { | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		searchOptions = searchOptions || { in: config.searchDefaultInQuick || 'titles' }; | ||||||
|  | 		const searchButton = $('#search-button'); | ||||||
|  | 		const searchFields = $('#search-fields'); | ||||||
|  | 		const searchInput = $('#search-fields input'); | ||||||
|  | 		const quickSearchContainer = $('#quick-search-container'); | ||||||
|  |  | ||||||
|  | 		$('#search-form .advanced-search-link').off('mousedown').on('mousedown', function () { | ||||||
|  | 			ajaxify.go('/search'); | ||||||
|  | 		}); | ||||||
|  |  | ||||||
|  | 		$('#search-form').off('submit').on('submit', function () { | ||||||
|  | 			searchInput.blur(); | ||||||
|  | 		}); | ||||||
|  | 		searchInput.off('blur').on('blur', function dismissSearch() { | ||||||
|  | 			setTimeout(function () { | ||||||
|  | 				if (!searchInput.is(':focus')) { | ||||||
|  | 					searchFields.addClass('hidden'); | ||||||
|  | 					searchButton.removeClass('hidden'); | ||||||
|  | 				} | ||||||
|  | 			}, 200); | ||||||
|  | 		}); | ||||||
|  | 		searchInput.off('focus'); | ||||||
|  |  | ||||||
|  | 		const searchElements = { | ||||||
|  | 			inputEl: searchInput, | ||||||
|  | 			resultEl: quickSearchContainer, | ||||||
|  | 		}; | ||||||
|  |  | ||||||
|  | 		Search.enableQuickSearch({ | ||||||
|  | 			searchOptions: searchOptions, | ||||||
|  | 			searchElements: searchElements, | ||||||
|  | 		}); | ||||||
|  |  | ||||||
|  | 		searchButton.off('click').on('click', function (e) { | ||||||
|  | 			if (!config.loggedIn && !app.user.privileges['search:content']) { | ||||||
|  | 				app.alert({ | ||||||
|  | 					message: '[[error:search-requires-login]]', | ||||||
|  | 					timeout: 3000, | ||||||
|  | 				}); | ||||||
|  | 				ajaxify.go('login'); | ||||||
|  | 				return false; | ||||||
|  | 			} | ||||||
|  | 			e.stopPropagation(); | ||||||
|  |  | ||||||
|  | 			Search.showAndFocusInput(); | ||||||
|  | 			return false; | ||||||
|  | 		}); | ||||||
|  |  | ||||||
|  | 		$('#search-form').off('submit').on('submit', function () { | ||||||
|  | 			const input = $(this).find('input'); | ||||||
|  | 			const data = Search.getSearchPreferences(); | ||||||
|  | 			data.term = input.val(); | ||||||
|  | 			hooks.fire('action:search.submit', { | ||||||
|  | 				searchOptions: data, | ||||||
|  | 				searchElements: searchElements, | ||||||
|  | 			}); | ||||||
|  | 			Search.query(data, function () { | ||||||
|  | 				input.val(''); | ||||||
|  | 			}); | ||||||
|  |  | ||||||
|  | 			return false; | ||||||
|  | 		}); | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	Search.enableQuickSearch = function (options) { | ||||||
|  | 		if (!config.searchEnabled || !app.user.privileges['search:content']) { | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		const searchOptions = Object.assign({ in: config.searchDefaultInQuick || 'titles' }, options.searchOptions); | ||||||
|  | 		const quickSearchResults = options.searchElements.resultEl; | ||||||
|  | 		const inputEl = options.searchElements.inputEl; | ||||||
|  | 		let oldValue = inputEl.val(); | ||||||
|  | 		const filterCategoryEl = quickSearchResults.find('.filter-category'); | ||||||
|  |  | ||||||
|  | 		function updateCategoryFilterName() { | ||||||
|  | 			if (ajaxify.data.template.category) { | ||||||
|  | 				translator.translate('[[search:search-in-category, ' + ajaxify.data.name + ']]', function (translated) { | ||||||
|  | 					const name = $('<div></div>').html(translated).text(); | ||||||
|  | 					filterCategoryEl.find('.name').text(name); | ||||||
|  | 				}); | ||||||
|  | 			} | ||||||
|  | 			filterCategoryEl.toggleClass('hidden', !ajaxify.data.template.category); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		function doSearch() { | ||||||
|  | 			options.searchOptions = Object.assign({}, searchOptions); | ||||||
|  | 			options.searchOptions.term = inputEl.val(); | ||||||
|  | 			updateCategoryFilterName(); | ||||||
|  |  | ||||||
|  | 			if (ajaxify.data.template.category) { | ||||||
|  | 				if (filterCategoryEl.find('input[type="checkbox"]').is(':checked')) { | ||||||
|  | 					options.searchOptions.categories = [ajaxify.data.cid]; | ||||||
|  | 					options.searchOptions.searchChildren = true; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			quickSearchResults.removeClass('hidden').find('.quick-search-results-container').html(''); | ||||||
|  | 			quickSearchResults.find('.loading-indicator').removeClass('hidden'); | ||||||
|  | 			hooks.fire('action:search.quick.start', options); | ||||||
|  | 			options.searchOptions.searchOnly = 1; | ||||||
|  | 			Search.api(options.searchOptions, function (data) { | ||||||
|  | 				quickSearchResults.find('.loading-indicator').addClass('hidden'); | ||||||
|  | 				if (options.hideOnNoMatches && !data.posts.length) { | ||||||
|  | 					return quickSearchResults.addClass('hidden').find('.quick-search-results-container').html(''); | ||||||
|  | 				} | ||||||
|  | 				data.posts.forEach(function (p) { | ||||||
|  | 					const text = $('<div>' + p.content + '</div>').text(); | ||||||
|  | 					const query = inputEl.val().toLowerCase().replace(/^in:topic-\d+/, ''); | ||||||
|  | 					const start = Math.max(0, text.toLowerCase().indexOf(query) - 40); | ||||||
|  | 					p.snippet = utils.escapeHTML((start > 0 ? '...' : '') + | ||||||
|  | 						text.slice(start, start + 80) + | ||||||
|  | 						(text.length - start > 80 ? '...' : '')); | ||||||
|  | 				}); | ||||||
|  | 				app.parseAndTranslate('partials/quick-search-results', data, function (html) { | ||||||
|  | 					if (html.length) { | ||||||
|  | 						html.find('.timeago').timeago(); | ||||||
|  | 					} | ||||||
|  | 					quickSearchResults.toggleClass('hidden', !html.length || !inputEl.is(':focus')) | ||||||
|  | 						.find('.quick-search-results-container') | ||||||
|  | 						.html(html.length ? html : ''); | ||||||
|  | 					const highlightEls = quickSearchResults.find( | ||||||
|  | 						'.quick-search-results .quick-search-title, .quick-search-results .snippet' | ||||||
|  | 					); | ||||||
|  | 					Search.highlightMatches(options.searchOptions.term, highlightEls); | ||||||
|  | 					hooks.fire('action:search.quick.complete', { | ||||||
|  | 						data: data, | ||||||
|  | 						options: options, | ||||||
|  | 					}); | ||||||
|  | 				}); | ||||||
|  | 			}); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		quickSearchResults.find('.filter-category input[type="checkbox"]').on('change', function () { | ||||||
|  | 			inputEl.focus(); | ||||||
|  | 			doSearch(); | ||||||
|  | 		}); | ||||||
|  |  | ||||||
|  | 		inputEl.off('keyup').on('keyup', utils.debounce(function () { | ||||||
|  | 			if (inputEl.val().length < 3) { | ||||||
|  | 				quickSearchResults.addClass('hidden'); | ||||||
|  | 				oldValue = inputEl.val(); | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | 			if (inputEl.val() === oldValue) { | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | 			oldValue = inputEl.val(); | ||||||
|  | 			if (!inputEl.is(':focus')) { | ||||||
|  | 				return quickSearchResults.addClass('hidden'); | ||||||
|  | 			} | ||||||
|  | 			doSearch(); | ||||||
|  | 		}, 500)); | ||||||
|  |  | ||||||
|  | 		let mousedownOnResults = false; | ||||||
|  | 		quickSearchResults.on('mousedown', function () { | ||||||
|  | 			$(window).one('mouseup', function () { | ||||||
|  | 				quickSearchResults.addClass('hidden'); | ||||||
|  | 			}); | ||||||
|  | 			mousedownOnResults = true; | ||||||
|  | 		}); | ||||||
|  | 		inputEl.on('blur', function () { | ||||||
|  | 			if (!inputEl.is(':focus') && !mousedownOnResults && !quickSearchResults.hasClass('hidden')) { | ||||||
|  | 				quickSearchResults.addClass('hidden'); | ||||||
|  | 			} | ||||||
|  | 		}); | ||||||
|  |  | ||||||
|  | 		let ajaxified = false; | ||||||
|  | 		hooks.on('action:ajaxify.end', function () { | ||||||
|  | 			if (!ajaxify.isCold()) { | ||||||
|  | 				ajaxified = true; | ||||||
|  | 			} | ||||||
|  | 		}); | ||||||
|  |  | ||||||
|  | 		inputEl.on('focus', function () { | ||||||
|  | 			mousedownOnResults = false; | ||||||
|  | 			const query = inputEl.val(); | ||||||
|  | 			oldValue = query; | ||||||
|  | 			if (query && quickSearchResults.find('#quick-search-results').children().length) { | ||||||
|  | 				updateCategoryFilterName(); | ||||||
|  | 				if (ajaxified) { | ||||||
|  | 					doSearch(); | ||||||
|  | 					ajaxified = false; | ||||||
|  | 				} else { | ||||||
|  | 					quickSearchResults.removeClass('hidden'); | ||||||
|  | 				} | ||||||
|  | 				inputEl[0].setSelectionRange( | ||||||
|  | 					query.startsWith('in:topic') ? query.indexOf(' ') + 1 : 0, | ||||||
|  | 					query.length | ||||||
|  | 				); | ||||||
|  | 			} | ||||||
|  | 		}); | ||||||
|  |  | ||||||
|  | 		inputEl.off('refresh').on('refresh', function () { | ||||||
|  | 			doSearch(); | ||||||
|  | 		}); | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	Search.showAndFocusInput = function () { | ||||||
|  | 		$('#search-fields').removeClass('hidden'); | ||||||
|  | 		$('#search-button').addClass('hidden'); | ||||||
|  | 		$('#search-fields input').focus(); | ||||||
|  | 	}; | ||||||
|  |  | ||||||
| 	Search.query = function (data, callback) { | 	Search.query = function (data, callback) { | ||||||
| 		callback = callback || function () {}; | 		callback = callback || function () {}; | ||||||
| 		ajaxify.go('search?' + createQueryString(data)); | 		ajaxify.go('search?' + createQueryString(data)); | ||||||
|   | |||||||
| @@ -75,6 +75,7 @@ JS.scripts = { | |||||||
| 		'public/src/modules/storage.js', | 		'public/src/modules/storage.js', | ||||||
| 		'public/src/modules/handleBack.js', | 		'public/src/modules/handleBack.js', | ||||||
| 		'public/src/modules/messages.js', | 		'public/src/modules/messages.js', | ||||||
|  | 		'public/src/modules/search.js', | ||||||
| 	], | 	], | ||||||
|  |  | ||||||
| 	admin: [ | 	admin: [ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user