summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRajat Vig <rajatv@thoughtworks.com>2015-07-15 10:41:38 -0700
committerRajat Vig <rajatv@thoughtworks.com>2015-07-16 20:03:55 +0000
commitfc2a3c6985b443c354c0e95d0814c1192a22a3a4 (patch)
treec4d6ee4b1686aae5aeb7d6796dfbbcc50c8cd544
parent1741baf4a0c29d29be8ebd91e2f9d0b18a0db363 (diff)
downloadxstatic-magic-search-fc2a3c6985b443c354c0e95d0814c1192a22a3a4.tar.gz
update to 0.2.5 of the magic search widget
Update the XStatic Magic Search package, to take advantage of Eucalyptus' new fixes and features. Including allowing multiple Magic Search widgets on same page. Change-Id: I1328ed868d1278d5cd631bcddcc0c2ba924e65b1 Partial-Bug: #1434710
-rw-r--r--xstatic/pkg/magic_search/__init__.py2
-rw-r--r--xstatic/pkg/magic_search/data/magic_search.html5
-rw-r--r--xstatic/pkg/magic_search/data/magic_search.js83
-rw-r--r--xstatic/pkg/magic_search/data/magic_search.scss51
4 files changed, 93 insertions, 48 deletions
diff --git a/xstatic/pkg/magic_search/__init__.py b/xstatic/pkg/magic_search/__init__.py
index 95f7fe5..edf6f44 100644
--- a/xstatic/pkg/magic_search/__init__.py
+++ b/xstatic/pkg/magic_search/__init__.py
@@ -11,7 +11,7 @@ NAME = __name__.split('.')[-1] # package name (e.g. 'foo' or 'foo_bar')
# please use a all-lowercase valid python
# package name
-VERSION = '0.2.0' # version of the packaged files, please use the upstream
+VERSION = '0.2.5' # version of the packaged files, please use the upstream
# version number
BUILD = '1' # our package build number, so we can release new builds
# with fixes for xstatic stuff.
diff --git a/xstatic/pkg/magic_search/data/magic_search.html b/xstatic/pkg/magic_search/data/magic_search.html
index e005920..1a0e6e6 100644
--- a/xstatic/pkg/magic_search/data/magic_search.html
+++ b/xstatic/pkg/magic_search/data/magic_search.html
@@ -1,5 +1,5 @@
<!--! Magic Searchbar -->
-<div class="magic-search" magic-overrides>
+<div class="magic-search" magic-overrides="">
<div class="search-bar">
<i class="fi-filter go"></i>
<div class="search-main-area">
@@ -18,7 +18,7 @@
{{ facetSelected.label[0] }}:
</span>
<div class="search-entry" is-open="isMenuOpen">
- <input class="search-input" type="text" data-dropdown="facet-drop" dropdown-toggle
+ <input class="search-input" type="text" data-dropdown="facet-drop" dropdown-toggle=""
placeholder="{{ strings.prompt }}" autocomplete="off" />
<ul id="facet-drop" class="f-dropdown dropdown-menu" data-dropdown-content="">
<li ng-repeat="facet in filteredObj" ng-show="!facetSelected">
@@ -38,6 +38,7 @@
ng-show="isMatchLabel(option.label)">
{{ option.label[0] }}<span class="match">{{ option.label[1] }}</span>{{ option.label[2] }}
</a>
+ </li>
</ul>
</div>
</div>
diff --git a/xstatic/pkg/magic_search/data/magic_search.js b/xstatic/pkg/magic_search/data/magic_search.js
index 347bb33..31f35e0 100644
--- a/xstatic/pkg/magic_search/data/magic_search.js
+++ b/xstatic/pkg/magic_search/data/magic_search.js
@@ -8,7 +8,7 @@
try{
angular.module('MagicSearch');
} catch (exception) {
- angular.module('MagicSearch', []);
+ angular.module('MagicSearch', []);
}
angular.module('MagicSearch')
@@ -23,8 +23,9 @@ angular.module('MagicSearch')
templateUrl: function (scope, elem) {
return elem.template;
},
- controller: function ($scope, $timeout) {
- $scope.promptString = $scope.strings['prompt'];
+ controller: function ($scope, $element, $timeout) {
+ var searchInput = $element.find('.search-input');
+ $scope.promptString = $scope.strings.prompt;
$scope.currentSearch = [];
$scope.initSearch = function() {
if (typeof $scope.facets_param === 'string') {
@@ -48,7 +49,7 @@ angular.module('MagicSearch')
initialFacets = initialFacets.split('&');
if (initialFacets.length > 1 || initialFacets[0].length > 0) {
$timeout(function() {
- $scope.strings['prompt'] = '';
+ $scope.strings.prompt = '';
});
}
angular.forEach(initialFacets, function(facet, idx) {
@@ -76,12 +77,18 @@ angular.module('MagicSearch')
});
});
if ($scope.textSearch !== undefined) {
- $scope.currentSearch.push({'name':'text='+$scope.textSearch, 'label':[$scope.strings['text'], $scope.textSearch]});
+ $scope.currentSearch.push({'name':'text='+$scope.textSearch, 'label':[$scope.strings.text, $scope.textSearch]});
}
$scope.filteredObj = $scope.facetsObj;
};
+ $scope.addFacets = function(facets) {
+ // add a facets javascript object to the existing list
+ for (var facet in facets) {
+ $scope.facetsObj.append(facet);
+ }
+ };
$scope.copyFacets = function(facets) {
- var ret = []
+ var ret = [];
for (var i=0; i<facets.length; i++) {
var facet = Object.create(facets[i]);
if (facets[i].options !== undefined) {
@@ -93,7 +100,7 @@ angular.module('MagicSearch')
ret.push(facet);
}
return ret;
- }
+ };
// removes a facet from the menu
$scope.deleteFacetSelection = function(facetParts) {
angular.forEach($scope.facetsObj.slice(), function(facet, idx) {
@@ -121,17 +128,17 @@ angular.module('MagicSearch')
}
});
};
- $('.search-input').on('keydown', function($event) { // handle ctrl-char input
+ searchInput.on('keydown', function($event) {
var key = $event.keyCode || $event.charCode;
if (key == 9) { // prevent default when we can.
$event.preventDefault();
}
});
- $('.search-input').on('keyup', function($event) { // handle ctrl-char input
- if ($event.metaKey == true) {
+ searchInput.on('keyup', function($event) { // handle ctrl-char input
+ if ($event.metaKey === true) {
return;
}
- var searchVal = $('.search-input').val();
+ var searchVal = searchInput.val();
var key = $event.keyCode || $event.charCode;
if (key == 9) { // tab, so select facet if narrowed down to 1
if ($scope.facetSelected === undefined) {
@@ -144,14 +151,14 @@ angular.module('MagicSearch')
$scope.resetState();
}
$timeout(function() {
- $('.search-input').val('');
+ searchInput.val('');
});
return;
}
if (key == 27) { // esc, so cancel and reset everthing
$timeout(function() {
$scope.hideMenu();
- $('.search-input').val('');
+ searchInput.val('');
});
$scope.resetState();
var textFilter = $scope.textSearch;
@@ -179,10 +186,10 @@ angular.module('MagicSearch')
$scope.currentSearch.splice(i, 1);
}
}
- $scope.currentSearch.push({'name':'text='+searchVal, 'label':[$scope.strings['text'], searchVal]});
+ $scope.currentSearch.push({'name':'text='+searchVal, 'label':[$scope.strings.text, searchVal]});
$scope.$apply();
$scope.hideMenu();
- $('.search-input').val('');
+ searchInput.val('');
$scope.$emit('textSearch', searchVal, $scope.filter_keys);
$scope.textSearch = searchVal;
}
@@ -191,15 +198,19 @@ angular.module('MagicSearch')
else {
if (searchVal === '') {
$scope.filteredObj = $scope.facetsObj;
+ $scope.$apply();
$scope.$emit('textSearch', '', $scope.filter_keys);
+ if ($scope.facetSelected && $scope.facetSelected.options === undefined) {
+ $scope.resetState();
+ }
}
else {
$scope.filterFacets(searchVal);
}
}
});
- $('.search-input').on('keypress', function($event) { // handle character input
- var searchVal = $('.search-input').val();
+ searchInput.on('keypress', function($event) { // handle character input
+ var searchVal = searchInput.val();
var key = $event.which || $event.keyCode || $event.charCode;
if (key != 8 && key != 46 && key != 13 && key != 9 && key != 27) {
searchVal = searchVal + String.fromCharCode(key).toLowerCase();
@@ -207,13 +218,17 @@ angular.module('MagicSearch')
if (searchVal == ' ') { // space and field is empty, show menu
$scope.showMenu();
$timeout(function() {
- $('.search-input').val('');
+ searchInput.val('');
});
return;
}
if (searchVal === '') {
$scope.filteredObj = $scope.facetsObj;
+ $scope.$apply();
$scope.$emit('textSearch', '', $scope.filter_keys);
+ if ($scope.facetSelected && $scope.facetSelected.options === undefined) {
+ $scope.resetState();
+ }
return;
}
if (key != 8 && key != 46) {
@@ -267,9 +282,10 @@ angular.module('MagicSearch')
}
};
// enable text entry when mouse clicked anywhere in search box
- $('.search-main-area').on("click", function($event) {
- $('.search-input').trigger("focus");
- if ($scope.facetSelected === undefined) {
+ $element.find('.search-main-area').on('click', function($event) {
+ var target = $($event.target);
+ if (target.is('.search-main-area')) {
+ searchInput.trigger('focus');
$scope.showMenu();
}
});
@@ -287,11 +303,11 @@ angular.module('MagicSearch')
$scope.showMenu();
}
$timeout(function() {
- $('.search-input').val('');
+ searchInput.val('');
});
- $scope.strings['prompt'] = '';
+ $scope.strings.prompt = '';
$timeout(function() {
- $('.search-input').focus();
+ searchInput.focus();
});
};
// when option clicked, complete facet and send event
@@ -319,11 +335,12 @@ angular.module('MagicSearch')
}
if (removed !== undefined && removed.indexOf('text') === 0) {
$scope.$emit('textSearch', '', $scope.filter_keys);
- $scope.textSearch = undefined
+ $scope.textSearch = undefined;
}
else {
$scope.$emit('searchUpdated', query);
if ($scope.currentSearch.length > 0) {
+ // prune facets as needed from menus
var newFacet = $scope.currentSearch[$scope.currentSearch.length-1].name;
var facetParts = newFacet.split('=');
angular.forEach($scope.facetsSave, function(facet, idx) {
@@ -348,10 +365,10 @@ angular.module('MagicSearch')
}
else {
$scope.resetState();
- $('.search-input').val('');
+ searchInput.val('');
}
- if ($scope.currentSearch.length == 0) {
- $scope.strings['prompt'] = $scope.promptString;
+ if ($scope.currentSearch.length === 0) {
+ $scope.strings.prompt = $scope.promptString;
}
// re-init to restore facets cleanly
$scope.facetsObj = $scope.copyFacets($scope.facetsSave);
@@ -366,24 +383,26 @@ angular.module('MagicSearch')
$scope.resetState();
$scope.$emit('searchUpdated', '');
$scope.$emit('textSearch', '', $scope.filter_keys);
- $scope.strings['prompt'] = $scope.promptString;
}
};
$scope.isMatchLabel = function(label) {
return Array.isArray(label);
};
$scope.resetState = function() {
- $('.search-input').val('');
+ searchInput.val('');
$scope.filteredObj = $scope.facetsObj;
$scope.facetSelected = undefined;
$scope.facetOptions = undefined;
- $scope.filteredOptions = undefined
+ $scope.filteredOptions = undefined;
+ if ($scope.currentSearch.length === 0) {
+ $scope.strings.prompt = $scope.promptString;
+ }
};
// showMenu and hideMenu depend on foundation's dropdown. They need
// to be modified to work with another dropdown implemenation (i.e. bootstrap)
$scope.showMenu = function() {
$timeout(function() {
- if ($('#facet-drop').hasClass('open') === false) {
+ if ($('#facet-drop').hasClass('open') === false && $scope.filteredObj.length > 0) {
$('.search-input').trigger('click');
}
});
diff --git a/xstatic/pkg/magic_search/data/magic_search.scss b/xstatic/pkg/magic_search/data/magic_search.scss
index b25cf3a..87ee4a5 100644
--- a/xstatic/pkg/magic_search/data/magic_search.scss
+++ b/xstatic/pkg/magic_search/data/magic_search.scss
@@ -3,6 +3,8 @@
/*-----------------------------------------
Colors
----------------------------------------- */
+$bordercolor: #ccc;
+$iconcolor: #6a737b;
$textcolor: #444;
$background: white;
$itembackground: #e6e7e8;
@@ -12,11 +14,13 @@ $itembackground: #e6e7e8;
----------------------------------------- */
@mixin item-list {
.item-list {
- margin-bottom: 6px;
+ position: relative;
+ //top: -0.30rem;
.item {
color: #333;
background-color: $itembackground;
- margin-right: 8px;
+ height: 1.3rem;
+ margin-right: 0.5rem;
a {
color: white;
}
@@ -24,20 +28,31 @@ $itembackground: #e6e7e8;
}
}
+@-moz-document url-prefix() {
+ .item-list {
+ .item {
+ top: -0.40rem;
+ }
+ }
+ .search-selected {
+ top: -0.40rem;
+ }
+}
+
/*-----------------------------------------
Magic Search bar
----------------------------------------- */
.search-bar {
position: relative;
- border: 1px solid black;
+ border: 1px solid $bordercolor;
background-color: $background;
margin-bottom: 0.5rem;
- padding: 4px;
+ padding: 0.25rem;
height: auto;
i.fi-filter {
- color: $textcolor;
+ color: $iconcolor;
position: absolute;
- top: 0.5rem;
+ top: 0.35rem;
left: 0.65rem;
}
.search-main-area {
@@ -47,38 +62,48 @@ $itembackground: #e6e7e8;
cursor: text;
}
@include item-list;
- .item-list {
- margin-bottom: 2px;
- }
+ //.item-list {
+ // margin-bottom: 0.125rem;
+ //}
.search-selected {
+ position: relative;
+ padding-left: 0;
+ padding-right: 0;
background-color: $background;
color: $textcolor;
}
.search-entry {
+ position: relative;
display: inline-block;
height: 1.5rem;
+ height: 1.5rem;
}
.search-input {
- width: 220px;
+ width: 17.5rem;
border: 0;
box-shadow: none;
height: 1.5rem;
- padding: 3px;
+ padding: 0.25rem;
+ margin-bottom: 0;
background-color: $background;
&:focus {
box-shadow: none;
+ background-color: $background;
}
}
.match {
font-weight: bold;
}
i.cancel {
- color: $textcolor;
+ color: $iconcolor;
&:hover {
color: darkred;
}
position: absolute;
- top: 0.5rem;
+ top: 0.35rem;
right: 0.65rem;
}
+ .f-dropdown.open {
+ left: 0 !important;
+ }
}