Add: static/js/(index > index.advanced-search-form).js -Migrate code relevant to the advanced search form to its own file. -Group global-scope function calls into wrapper functions executed on definition. -Add datepicker to new form's input fields.tags/v1.0^2
@@ -0,0 +1,112 @@ | |||
/* | |||
* @file Manages all advanced search form logic. | |||
*/ | |||
var searchGroups = $("div#search-groups"); | |||
/* | |||
* Load all advanced search form libraries. | |||
*/ | |||
(function loadInputFieldWidgets(){ | |||
$(".search-group input#date-last-modified").datepicker(); | |||
$(".search-group input#date-created").datepicker(); | |||
var languages = new Bloodhound({ | |||
datumTokenizer: Bloodhound.tokenizers.obj.whitespace("value"), | |||
queryTokenizer: Bloodhound.tokenizers.whitespace, | |||
local: $.map(TYPEAHEAD_LANGUAGES, function(state){ | |||
return {value : state}; | |||
}) | |||
}); | |||
languages.initialize(); | |||
$("#language.typeahead").typeahead({ | |||
hint: true, | |||
highlight: true, | |||
minLength: 1 | |||
}, | |||
{ | |||
name: "languages", | |||
displayKey: "value", | |||
source: languages.ttAdapter() | |||
}); | |||
}()); | |||
/* | |||
* Set all advanced search form button callbacks. | |||
*/ | |||
(function setSearchFormCallbacks(){ | |||
// Create a new search group, and update the `#sidebar` checklist accordingly. | |||
$("button#add-group").click(function(){ | |||
$("div#sidebar input[type=checkbox]").prop("checked", false); | |||
searchGroups.children("#selected").removeAttr("id"); | |||
var searchGroup = $("<div/>", {class : "search-group", id : "selected"}); | |||
searchGroups.append(searchGroup.append(createSearchGroupInput("language"))); | |||
$("div#sidebar input[type=checkbox]#language").prop("checked", true); | |||
}); | |||
// Remove the currently selected group if it's not the only one, and mark one | |||
// of its siblings as selected. | |||
$("button#remove-group").click(function(){ | |||
var currentGroup = $("div.search-group#selected"); | |||
if($("div.search-group").length == 1) | |||
return; | |||
else { | |||
var nextGroup = currentGroup.prev(); | |||
if(nextGroup.size() == 0) | |||
nextGroup = currentGroup.next(); | |||
} | |||
currentGroup.remove(); | |||
nextGroup.click(); | |||
}); | |||
// Select a search group, and update the `#sidebar` checklist accordingly. | |||
$(document).on("click", "div.search-group", function(){ | |||
searchGroups.children("#selected").removeAttr("id"); | |||
$(this).attr("id", "selected"); | |||
$("div#sidebar input[type=checkbox]").prop("checked", false); | |||
$(this).find("input[type=text]").each(function(){ | |||
var checkBoxSelector = "div#sidebar input[type=checkbox]"; | |||
$(checkBoxSelector + "#" + $(this).attr("class").split(" ")[0]). | |||
prop("checked", true); | |||
}) | |||
}); | |||
// Add an input field to the currently selected search group. | |||
$("div#sidebar input[type=checkbox]").click(function(){ | |||
var fieldId = $(this).prop("id"); | |||
if($(this).is(":checked")){ | |||
$("div.search-group#selected").append( | |||
$.parseHTML(createSearchGroupInput(fieldId))); | |||
if(fieldId.slice(0, 4) == "date") | |||
$(".search-group#selected ." + fieldId).datepicker(); | |||
} | |||
else | |||
$("div.search-group#selected ." + fieldId).remove() | |||
}); | |||
}()); | |||
/* | |||
* Return an HTML string representing a new input field div in a search group. | |||
* | |||
* @param fieldId The id of the input field div, and its child elements. | |||
*/ | |||
function createSearchGroupInput(fieldId){ | |||
return [ | |||
"<div id='" + fieldId + "'>", | |||
"<div>" + fieldId.replace(/-/g, " ") + "</div>", | |||
"<input class='" + fieldId + "'type='text'/>", | |||
"<input type='checkbox' name='regex'><span>Regex</span>", | |||
"</div>" | |||
].join(""); | |||
} | |||
function assembleQuery(){ | |||
var groups = searchGroups.children(".search-group"); | |||
var groupQueries = []; | |||
for(var group = 0; group < groups.length; group++) | |||
console.log(group); | |||
} |
@@ -20,29 +20,6 @@ advancedSearchButton.click(function(){ | |||
} | |||
}); | |||
$("#date-last-modified").datepicker(); | |||
$("#date-created").datepicker(); | |||
var languages = new Bloodhound({ | |||
datumTokenizer: Bloodhound.tokenizers.obj.whitespace("value"), | |||
queryTokenizer: Bloodhound.tokenizers.whitespace, | |||
local: $.map(TYPEAHEAD_LANGUAGES, function(state){ | |||
return {value : state}; | |||
}) | |||
}); | |||
languages.initialize(); | |||
$("#languages.typeahead").typeahead({ | |||
hint: true, | |||
highlight: true, | |||
minLength: 1 | |||
}, | |||
{ | |||
name: "languages", | |||
displayKey: "value", | |||
source: languages.ttAdapter() | |||
}); | |||
FINISH_TYPING_INTERVAL = 650; | |||
searchBar = $("form#search-bar input[type='text']")[0]; | |||
resultsDiv = $("div#results")[0]; | |||
@@ -170,65 +147,3 @@ function loadMoreResults(){ | |||
result * 20); | |||
} | |||
} | |||
var searchGroups = $("div#search-groups"); | |||
// Create a new search group, and update the `#sidebar` checklist accordingly. | |||
$("button#add-group").click(function(){ | |||
$("div#sidebar input[type=checkbox]").prop("checked", false); | |||
searchGroups.children("#selected").removeAttr("id"); | |||
var searchGroup = $("<div/>", {class : "search-group", id : "selected"}); | |||
searchGroups.append(searchGroup.append(createSearchGroupInput("language"))); | |||
$("div#sidebar input[type=checkbox]#language").prop("checked", true); | |||
}); | |||
$("button#remove-group").click(function(){ | |||
var currentGroup = $("div.search-group#selected"); | |||
if($("div.search-group").length == 1) | |||
return; | |||
else { | |||
var nextGroup = currentGroup.prev(); | |||
if(nextGroup.size() == 0) | |||
nextGroup = currentGroup.next(); | |||
} | |||
currentGroup.remove(); | |||
nextGroup.click(); | |||
}); | |||
// Select a search group, and update the `#sidebar` checklist accordingly. | |||
$(document).on("click", "div.search-group", function(){ | |||
searchGroups.children("#selected").removeAttr("id"); | |||
$(this).attr("id", "selected"); | |||
$("div#sidebar input[type=checkbox]").prop("checked", false); | |||
$(this).find("input[type=text]").each(function(){ | |||
var checkBoxSelector = "div#sidebar input[type=checkbox]"; | |||
$(checkBoxSelector + "#" + $(this).attr("id")).prop("checked", true); | |||
}) | |||
}); | |||
// Add an input field to the currently selected search group. | |||
$("div#sidebar input[type=checkbox]").click(function(){ | |||
var fieldId = $(this).prop("id"); | |||
if($(this).is(":checked")) | |||
$("div.search-group#selected").append( | |||
$.parseHTML(createSearchGroupInput(fieldId))); | |||
else | |||
$("div.search-group#selected #" + fieldId).remove() | |||
}); | |||
/* | |||
* Return an HTML string representing a new input field div in a search group. | |||
* | |||
* @param fieldId The id of the input field div, and its child elements. | |||
*/ | |||
function createSearchGroupInput(fieldId){ | |||
return [ | |||
"<div id='" + fieldId + "'>", | |||
"<div>" + fieldId.replace(/-/g, " ") + "</div>", | |||
"<input id='" + fieldId + "'type='text'/>", | |||
"<input type='checkbox' name='regex'><span>Regex</span>", | |||
"</div>" | |||
].join(""); | |||
} |
@@ -9,7 +9,8 @@ | |||
font-size: 70% | |||
.twitter-typeahead | |||
width: 100% | |||
// display: inline-block | |||
width: 60% | |||
.tt-hint | |||
color: $baseColor2 | |||
@@ -117,10 +118,11 @@ div#search-field | |||
background-color: white | |||
border: 1px solid $baseColor3 | |||
font-size: 96% | |||
height: 400px | |||
min-width: $minSearchFieldsWidth | |||
padding-top: 0px | |||
overflow-x: auto | |||
height: 400px | |||
overflow-y: hidden | |||
#heading | |||
color: $baseColor2 | |||
@@ -242,15 +244,15 @@ div#search-field | |||
>div | |||
margin-bottom: 0.7% | |||
div | |||
>div | |||
display: inline-block | |||
width: 18% | |||
input[type=text] | |||
>input[type=text] | |||
padding: 2px | |||
width: 60% | |||
input[type=checkbox] | |||
>input[type=checkbox] | |||
margin-left: 2% | |||
&:checked + span | |||
@@ -259,7 +261,7 @@ div#search-field | |||
color: green | |||
font-weight: bold | |||
span | |||
span.regex | |||
font-size: 80% | |||
&#selected | |||
@@ -84,8 +84,8 @@ | |||
<div class="search-group" id="selected"> | |||
<div id="language"> | |||
<div>language</div> | |||
<input id="language" type="text"> | |||
<input type="checkbox" name="regex"><span>Regex</span> | |||
<input class="language" type="text"> | |||
<input type="checkbox" name="regex"><span class="regex">Regex</span> | |||
</div> | |||
</div> | |||
</div> | |||
@@ -96,4 +96,5 @@ | |||
<div id="results"></div> | |||
{{ assets.tag("index.js") }} | |||
{{ assets.tag("index.advanced-search-form.js") }} | |||
= endblock |