123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- /*
- * GitPHP javascript project search
- *
- * Live search of project list
- *
- * @author Christopher Han <xiphux@gmail.com>
- * @copyright Copyright (c) 2010 Christopher Han
- * @package GitPHP
- * @subpackage Javascript
- */
- define(["jquery", 'modules/resources', 'modules/hassearchreset'],
- function($, resources, hassearchreset) {
- var table = null;
- var searchPanel = null;
- var msgContainer = null;
- var currentSearch = '';
- var searchTimer = null;
- var self = null;
- var clearSearch = function() {
- searchPanel.find('img searchSpinner').show();
- searchPanel.find('input.projectSearchBox').val('');
- currentSearch = '';
- search('');
- searchPanel.find('img.searchSpinner').hide();
- return false;
- };
- var doSearch = function() {
- var newSearch = searchPanel.find('input.projectSearchBox').val().toLowerCase();
- if (newSearch != currentSearch) {
- searchPanel.find('img.searchSpinner').show();
- if (searchTimer != null) {
- clearTimeout(searchTimer);
- }
- currentSearch = newSearch;
- searchTimer = setTimeout(function() {
- self.search(newSearch);
- searchPanel.find('img.searchSpinner').hide();
- }, 500);
- }
- };
- function bindEvents() {
- searchPanel.find('form').keypress(function(e) {
- if (e.which == 13) {
- return false;
- }
- });
- if (table.find('tr.projectRow').size() > 0) {
- if (!hassearchreset()) {
- searchPanel.find('a.clearSearch').click(clearSearch);
- }
- searchPanel.find('input.projectSearchBox').keyup(doSearch).bind('input paste', doSearch);
- }
- }
- function searchRow(row, searchString) {
- var projectName = row.find('td.projectName span').text();
- if ((projectName.length > 0) && (projectName.toLowerCase().indexOf(searchString) != -1)) {
- return true;
- }
- var projectDesc = row.find('td.projectDescription span').text();
- if ((projectDesc.length > 0) && (projectDesc.toLowerCase().indexOf(searchString) != -1)) {
- return true;
- }
- var projectOwner = row.find('td.projectOwner em').text();
- if ((projectOwner.length > 0) && (projectOwner.toLowerCase().indexOf(searchString) != -1)) {
- return true;
- }
- return false;
- }
- function noMatchesMessage(show, searchString) {
- if (show) {
- if (!msgContainer) {
- msgContainer = jQuery(document.createElement('div'));
- msgContainer.addClass('message');
- msgContainer.appendTo(table);
- }
- var msg = resources.NoMatchesFound.replace(new RegExp('%1'), searchString);
- msgContainer.text(msg);
- msgContainer.show();
- } else {
- if (msgContainer) {
- msgContainer.hide();
- }
- }
- }
- var search = function(searchString) {
- clearTimeout(searchTimer);
- searchTimer = null;
- if (!hassearchreset()) {
- if (searchString.length == 0) {
- searchPanel.find('a.clearSearch').hide();
- } else {
- searchPanel.find('a.clearSearch').show();
- }
- }
- var hasMatch = false;
- var visibleCategories = [];
- // search each project
- table.find('tr.projectRow').each(function() {
- var jThis = $(this);
- if (searchString.length < 1) {
- jThis.show();
- hasMatch = true;
- return;
- }
- if (searchRow(jThis, searchString)) {
- jThis.show();
- hasMatch = true;
- var category = jThis.data('category');
- if (category && (jQuery.inArray(category, visibleCategories) == -1)) {
- visibleCategories.push(category);
- }
- } else {
- jThis.hide();
- }
- });
- // show categories that have matching projects
- table.find('tr.categoryRow').each(function() {
- var jThis = $(this);
- if (searchString.length < 1) {
- jThis.show();
- return;
- }
- var category = jThis.children('th.categoryName').text();
- if (category.length > 0) {
- if (jQuery.inArray(category, visibleCategories) !== -1) {
- jThis.show();
- } else {
- jThis.hide();
- }
- }
- });
- if (hasMatch) {
- noMatchesMessage(false);
- table.find('tr.projectHeader').show();
- } else {
- noMatchesMessage(true, searchString)
- table.find('tr.projectHeader').hide();
- }
- };
- var init = function(tableElem, searchPanelElem) {
- table = tableElem;
- searchPanel = searchPanelElem;
- self = this;
- // store project categories
- var category = "";
- table.find('tr').each(function() {
- var jThis = $(this);
- if (jThis.hasClass('categoryRow')) {
- category = jThis.children('th.categoryName').text();
- } else if (jThis.hasClass('projectRow')) {
- if (category.length > 0) {
- jThis.data('category', category);
- }
- }
- });
- bindEvents();
- };
- return {
- init: init,
- search: search
- }
- }
- );
|