angular-smart-search 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 98c570f756f33bc7318eddd400bf9ca156fa8699
4
+ data.tar.gz: c091854d1356759f86c45ae54d1c44665ba730d7
5
+ SHA512:
6
+ metadata.gz: 8b5b605c23e57e67143d53b8426bcbb85685760c7777b9ba86e5f74356df8dc572322a69ddb20a0c90ff4baca34466feb3b918ceed0c064c56e576cfa895c5e6
7
+ data.tar.gz: eea4b5b51d135db8e1216200a74ee49e50a8b58b230fdf8c5027b47ebbc87889febf59845b539e7ccfa911488c15f6c54c0fa8ec1b9a0c4d14d5ffe05041b49d
@@ -0,0 +1,219 @@
1
+ // author: Samuel Mueller
2
+ // version: 0.0.1
3
+ // license: MIT
4
+ // homepage: http://github.com/ssmm/angular-smart-search
5
+ (function() {
6
+ var padding, template;
7
+
8
+ padding = 30;
9
+
10
+ angular.module("angular-smart-search", []);
11
+
12
+ angular.module("angular-smart-search").directive("smartSearch", [
13
+ "$http", "searchQueryFactory", function($http, searchQueryFactory) {
14
+ var QueryState;
15
+
16
+ QueryState = function() {
17
+ this.state = 'initial';
18
+ this.query = void 0;
19
+ this.is = function(state) {
20
+ return this.state === state;
21
+ };
22
+ this.setTo = function(state) {
23
+ return this.state = state;
24
+ };
25
+ };
26
+ return {
27
+ restrict: "A",
28
+ scope: true,
29
+ replace: true,
30
+ template: template,
31
+ compile: function(element, attributes, transclude) {
32
+ var id_field;
33
+
34
+ id_field = angular.element("<input ng-model='result.id' type='text' style='width: 30px; text-align: center; display: none;' disabled='disabled'>");
35
+ id_field.attr("id", attributes.id);
36
+ id_field.attr("name", attributes.name);
37
+ element.append(id_field);
38
+ return {
39
+ post: function($scope, $element, $attributes) {
40
+ var allowedFormats, input, outerQueryTimeout, overlay, queryState, service;
41
+
42
+ allowedFormats = $attributes.formats.split(" ");
43
+ service = $attributes.service;
44
+ input = $element.find("[queryfield]");
45
+ overlay = $element.children("[overlay]");
46
+ $scope.show = function() {
47
+ var position;
48
+
49
+ position = input.position();
50
+ overlay.css("top", position.top - padding);
51
+ overlay.css("left", position.left - padding);
52
+ return overlay.show("fade");
53
+ };
54
+ $scope.hide = function() {
55
+ return overlay.hide("fade");
56
+ };
57
+ $scope.search = function(query) {
58
+ return $http.get("" + service + ".json?fulltext=" + query).success(function(data) {
59
+ $scope.quickQuery = "";
60
+ return $scope.resultList = data;
61
+ }).error(function() {});
62
+ };
63
+ $scope.pick = function(item) {
64
+ queryState.setTo("successful");
65
+ $scope.result = item;
66
+ return $scope.hide();
67
+ };
68
+ $scope.hover = function(item) {
69
+ return $scope.currentItem = item;
70
+ };
71
+ outerQueryTimeout = null;
72
+ queryState = new QueryState();
73
+ $scope.queryState = queryState;
74
+ return $scope.outerQueryChanged = function(query) {
75
+ window.clearTimeout(outerQueryTimeout);
76
+ query = searchQueryFactory(query, allowedFormats);
77
+ if (query) {
78
+ queryState.setTo("changed");
79
+ queryState.query = query;
80
+ return outerQueryTimeout = window.setTimeout(function() {
81
+ queryState.setTo("pending");
82
+ $http.get("" + service + ".json?" + query.format.name + "=" + query.query).success(function(data) {
83
+ if (data[0] && data[0].id) {
84
+ queryState.setTo("successful");
85
+ return $scope.result = data[0];
86
+ } else {
87
+ return queryState.setTo("unsuccessful");
88
+ }
89
+ }).error(function() {
90
+ return queryState.setTo("error");
91
+ });
92
+ return $scope.$apply();
93
+ }, 1200);
94
+ } else {
95
+ return queryState.setTo("invalid-format");
96
+ }
97
+ };
98
+ }
99
+ };
100
+ }
101
+ };
102
+ }
103
+ ]);
104
+
105
+ template = '\
106
+ <div>\
107
+ <!-- input section you see initially -->\
108
+ <div class="input-prepend input-append">\
109
+ <!-- gray display section -->\
110
+ <span class="add-on" style="min-width: 200px;">\
111
+ <!-- result if found -->\
112
+ <span ng-show="queryState.is(\'successful\')">\
113
+ <i class="ubs-icon-small-suitability"></i>\
114
+ {{result.displayText}}\
115
+ </span>\
116
+ <!-- query states -->\
117
+ <span ng-show="queryState.is(\'changed\')">\
118
+ <em>{{queryState.query.format.name}} detected</em>\
119
+ </span>\
120
+ <span ng-show="queryState.is(\'pending\')">\
121
+ <em>searching...</em>\
122
+ </span>\
123
+ <span ng-show="queryState.is(\'unsuccessful\')">\
124
+ <em>Not found</em>\
125
+ </span>\
126
+ <span ng-show="queryState.is(\'invalid-format\')">\
127
+ <em>Invalid format</em>\
128
+ </span>\
129
+ <span ng-show="queryState.is(\'error\')">\
130
+ <em>Error</em>\
131
+ </span>\
132
+ </span>\
133
+ <!-- quick query field -->\
134
+ <input ng-change="outerQueryChanged(quickQuery)" ng-model="quickQuery" queryfield="" style="width: 100px;" type="text">\
135
+ <!-- button that triggers detail search overlay -->\
136
+ <button class="btn btn-ubs-dark" ng-click="show()">\
137
+ <i class="ubs-icon-small-search ubs-icon-small-white"></i>\
138
+ </button>\
139
+ </div>\
140
+ <!-- detail search overlay, initially hidden -->\
141
+ <div class="uw-overlay shadow" ng-mouseleave="hide()" overlay="">\
142
+ <div class="row-fluid">\
143
+ <div class="span12">\
144
+ <div class="input-append">\
145
+ <input detail-queryfield="" ng-model="detailQuery" type="text">\
146
+ <button class="btn btn-ubs-dark" ng-click="search(detailQuery)">\
147
+ <i class="ubs-icon-small-search ubs-icon-small-white"></i>\
148
+ </button>\
149
+ </div>\
150
+ </div>\
151
+ </div>\
152
+ <div class="horizontal-space"></div>\
153
+ <div class="row-fluid">\
154
+ <div class="span12">\
155
+ <table at-table="" class="table table-bordered table-hover" fill-last-page="" pagination="wildPagination">\
156
+ <thead></thead>\
157
+ <tbody>\
158
+ <tr ng-mouseover="hover(item)">\
159
+ <td at-implicit="" attribute="id" class="sortable 50px"></td>\
160
+ <td at-implicit="" attribute="displayText" class="sortable 280px" title="Result"></td>\
161
+ <td class="50px" title="-">\
162
+ <button class="btn btn-mini btn-ubs-blue" ng-click="pick(item)">pick</button>\
163
+ </td>\
164
+ </tr>\
165
+ </tbody>\
166
+ </table>\
167
+ <at-pagination instance="wildPagination" items-per-page="3" list="resultList"></at-pagination>\
168
+ </div>\
169
+ </div>\
170
+ </div>\
171
+ </div>\
172
+ ';
173
+
174
+ angular.module("angular-smart-search").provider("searchQueryFactory", [
175
+ function() {
176
+ var Query, detectFormat, formats;
177
+
178
+ Query = function(query, format) {
179
+ this.format = format;
180
+ this.query = query;
181
+ };
182
+ formats = {};
183
+ detectFormat = function(query, allowedFormats) {
184
+ var name, _i, _len;
185
+
186
+ for (_i = 0, _len = allowedFormats.length; _i < _len; _i++) {
187
+ name = allowedFormats[_i];
188
+ if (formats[name].pattern.exec(query)) {
189
+ return formats[name];
190
+ }
191
+ }
192
+ };
193
+ this.registerFormats = function(formats) {
194
+ var format, _i, _len, _results;
195
+
196
+ _results = [];
197
+ for (_i = 0, _len = formats.length; _i < _len; _i++) {
198
+ format = formats[_i];
199
+ _results.push(this.registerFormat(format));
200
+ }
201
+ return _results;
202
+ };
203
+ this.registerFormat = function(format) {
204
+ return formats[format.name] = format;
205
+ };
206
+ return this.$get = function() {
207
+ return function(query, allowedFormats) {
208
+ var format;
209
+
210
+ format = detectFormat(query, allowedFormats);
211
+ if (format) {
212
+ return new Query(query, format);
213
+ }
214
+ };
215
+ };
216
+ }
217
+ ]);
218
+
219
+ }).call(this);
@@ -0,0 +1,4 @@
1
+ module AngularSmartSearch
2
+ class Engine < ::Rails::Engine
3
+ end
4
+ end
@@ -0,0 +1,3 @@
1
+ module AngularSmartSearch
2
+ VERSION = "0.0.1"
3
+ end
metadata ADDED
@@ -0,0 +1,76 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: angular-smart-search
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Samuel Mueller
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-06-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: angular smart search
42
+ email:
43
+ - mueller.samu@gmail.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - lib/angular-smart-search/version.rb
49
+ - lib/angular-smart-search.rb
50
+ - app/assets/javascripts/angular-smart-search.js
51
+ homepage: https://github.com/ssmm/angular-smart-search
52
+ licenses:
53
+ - MIT
54
+ metadata: {}
55
+ post_install_message:
56
+ rdoc_options: []
57
+ require_paths:
58
+ - lib
59
+ required_ruby_version: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ requirements: []
70
+ rubyforge_project:
71
+ rubygems_version: 2.0.3
72
+ signing_key:
73
+ specification_version: 4
74
+ summary: angular smart search
75
+ test_files: []
76
+ has_rdoc: